设计模式分为三种类型,共23种
- 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
- 结构型模式:代理模式、装饰模式、外观模式、享元模式、桥接模式、组合模式、适配器模式
- 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式
经过设计之禅这本书籍的学习之后,又观察多篇博文,总结一片自认为通俗易懂的工厂模式知识整理
从第一眼到现在,我终究认为工厂模式的存在,就在于快速返回我们的需要的实体类,而我们需要的实体类方法,均在对应的实体类内部实现
请进入快速学习阶段,留出几个小时边喝茶,边读,边思考 ~
常见的工厂模式主要俩种,一为简单工厂模式
,二为抽象工厂模式
,这里我们先学习简单工厂模式,打一打基础 ~
作用:通过工厂类,统一出口,快速返回需求实体类,从而调用对应类的方法
优点:使用便捷,方便管理,扩展性强
角色划分:抽象产品类、具体产品类、工厂管理类
个人理解:工厂模式主要是统一出口,具体实现主要在具体产品类
基础版
主要是开阔思维,奠定自身基础,其角色划分也相对较少,主要分为具体产品类、工厂管理类
具体产品类
package com.example.yongliu.factorypattern;
import android.util.Log;
/**
* author yongliu
* date 2017/12/25.
* desc:
*/
public class Answer {
public static void answer(){
Log.e("tag","当然是我啦!");
}
}
工厂管理类
package com.example.yongliu.factorypattern;
/**
* author yongliu
* date 2017/12/25.
* desc:
*/
public class QuestionFactory {
public static Answer createAnswer(){
return new Answer();
}
}
使用方式
mAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建工厂类
QuestionFactory questionFactory = new QuestionFactory();
//通过工厂类创建具体产品类
Answer answer = questionFactory.createAnswer();
answer.answer();
}
});
输出结果
项目版
在项目中更实用且常见的还是这个版本,我们将共性产品类通过继承抽象产品类的方式实现了二次封装
角色划分
- 抽象产品类(基类 或 接口类)
- 具体产品类(一般可以有多个)
- 工厂管理类(统一出口)
抽象产品类(继承基类方式)- Parent
package com.example.yongliu.factorypattern;
import android.util.Log;
/**
* author yongliu
* date 2017/12/23.
* desc:
*/
public abstract class Parent {
void gender(){
Log.e("tag","性别:男性");
}
abstract void talk();
abstract void job();
}
具体产品类
- Father
package com.example.yongliu.factorypattern;
import android.util.Log;
/**
* author yongliu
* date 2017/12/23.
* desc:
*/
public class Farther extends Parent {
@Override
void talk() {
Log.e("tag","老爸说的中文");
}
@Override
void job() {
Log.e("tag","老爸的职业是老师");
}
@Override
void gender() {
super.gender();
}
}
- Uncle
package com.example.yongliu.factorypattern;
import android.util.Log;
/**
* author yongliu
* date 2017/12/23.
* desc:
*/
public class Uncle extends Parent {
@Override
void talk() {
Log.e("tag","叔叔说的英文");
}
@Override
void job() {
Log.e("tag","叔叔的工作是保安");
}
@Override
void gender() {
Log.e("tag","在Uncle类重写性别的方法,告诉大家叔叔也是男性");
}
}
工厂管理类 - PeopleFactory
package com.example.yongliu.factorypattern;
/**
* author yongliu
* date 2017/12/23.
* desc:
*/
public class PeopleFactory {
public static Parent createFather(){
return new Farther();
}
public static Parent createUncle(){
return new Uncle();
}
public static Parent createYouLike(int tag){
if(tag ==0){
return new Farther();
}else{
return new Uncle();
}
}
}
使用方式
MainActivity
package com.example.yongliu.factorypattern;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mFather;
private TextView mUncle;
private PeopleFactory peopleFactory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建工厂
peopleFactory = new PeopleFactory();
mFather = findViewById(R.id.tv_father);
mUncle = findViewById(R.id.tv_uncle);
mFather.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Father类的数据 说中文 当老师 男性
Parent father = peopleFactory.createFather();
father.talk();
father.job();
father.job();
father.gender();
}
});
mUncle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Uncle类的数据 说英文,当保安 男性
Parent uncle = peopleFactory.createUncle();
uncle.talk();
uncle.job();
uncle.gender();
}
});
//根据传值,创建对应的类
// peopleFactory.createYouLike()
}
}
输出结果
图1:示
图2:示