工厂模式也是为了构建一个新的对象,它是创建型模式的一种。
Android源码设计模式——Build模式(应用:AlertDialog源码分析)
上述是之前的Build模式,也是创建型模式一种,不懂的小伙伴可以回看下上篇博客。
工厂模式的定义
自我叙述:定义一个抽象产品类,然后继承该抽象类形成很多的子类,在子类相当于是个:成品的产品,也就是我们真正要构建的产品。在定义一个抽象类,该抽象类内部:创建子类的公共方法定义。在定义真正的工厂实现类,继承自该抽象类。
由此看下工厂模式的UML图:
UML图

上图,分四块:
- ABS Product —— 产品抽象类
- ConcreteProduct —— 产品实现类
- Abs Factory —— 抽象工厂类
- ConcreteFactory —— 工厂实现类
根据上述代码,写一个例子感受下,还是以我们的小汽车为例:
Abs Product 小汽车的框架
不管什么小汽车,他们都需要:轮子,发动机,车灯等公用零件
public abstract class AbsCar {protected String wheel; //轮子protected String engine; //发动机protected String lampBulb; //车灯// ........等等公共零件protected abstract void setWheel(String wheel);protected abstract void setEngine(String engine);protected abstract void setLampBulb(String lampBulb);
}
具体生产的小汽车
根据公共的生产小汽车标准,我们演化出了众多类型的车,比如:奔驰,丰田。
public class ConcreteBenzCar extends AbsCar {private final static String TAG = "奔驰汽车";@Overrideprotected void setWheel(String wheel) {Log.e(TAG, "构造轮子");}@Overrideprotected void setEngine(String engine) {Log.e(TAG, "构造发动机");}@Overrideprotected void setLampBulb(String lampBulb) {Log.e(TAG, "构造车灯");}
}
public class ConcreteToyotaCar extends AbsCar {private final static String TAG = "丰田汽车";@Overrideprotected void setWheel(String wheel) {Log.e(TAG, "构造轮子");}@Overrideprotected void setEngine(String engine) {Log.e(TAG, "构造发动机");}@Overrideprotected void setLampBulb(String lampBulb) {Log.e(TAG, "构造车灯");}
}
我们构造了两种类型的小汽车:奔驰和丰田。同理,也可以以抽象类为基准,生产出各种各样类型的小汽车。
构建小汽车的工厂标准
由于我们生成小汽车是需要工厂的,不同的汽车工厂标准都是一样的:生产出汽车。
public abstract class AbsFactory {public abstract <T extends AbsCar> T createProduct(Class<T> mClass);
}
现在创建工厂的标准有了,该创建工厂了
创建工厂实现类
public class ConcreteCarFactory extends AbsFactory {//***********************方法1*************************//public ConcreteBenzCar createBenz() {ConcreteBenzCar car = new ConcreteBenzCar();//TODO: 构造return car;}public ConcreteToyotaCar createToyota() {ConcreteToyotaCar car = new ConcreteToyotaCar();//TODO:构造return car;}//***********************方法2*************************//@Overridepublic <T extends AbsCar> T createProduct(Class<T> mClass) {T object = null;try {object = (T) Class.forName(mClass.getName()).newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}return object;}
}
上文定义了两种方法
- 直接创建产品
- 通过反射创建产品
实际上关于使用工厂模式,我觉得还是得根据项目实际出发的。
有的人说:Activity的onCreate方法的调用就属于工厂模式,但是我是在看不出来。关于Activity的启动流程分析博客:
Android进阶3:Activity源码分析(1) —— Activity启动流程(8.0)
源码地址:
GitHub示例源码