前言
本文是对《Adroid 源码设计模式解析与实战》 何红辉、关爱民 著 人民邮电出版社所做的读书笔记。文章是对本书的一些列学习笔记,如若有侵犯到作者权益,还望作者能联系我,我会及时下架。
这本书不错,有兴趣的同学可以买原书看看。
感兴趣的朋友欢迎加入学习小组QQ群: 193765960。
版权归作者所有,如有转发,请注明文章出处:https://xiaodanchen.github.io/archives/
1. 工厂方法模式的定义
定义一个用于创建对象的接口,让子类决定实例化那个类。(将零部件组装成不同的产品)
2. 工厂方法模式的实现
先说明两个接口:抽象产品类和抽象工厂类。
抽象产品类:定义了产品族,同一产品组的产品具有相似的功能,因此可以使用同一个产品线。
抽象工厂类:定义了产品线
2.1 厂长小明的幸福人生
屌丝程序员小明,越来越觉得自己没有写代码的天赋,一狠心开办了一家汽车厂,主要负责Audi某种车型的组装,比如Q3、Q5、Q7,于是乎小明找到了技术界的装逼高手小民帮忙给他设计了汽车厂流水线。
由于Q3、Q5、Q7这类车型,因为内部结构差异并不大,所以一条生产线足以应付这3种车型,小民于是采用了工厂方法模式,开玩笑的说我们不生产零件,我们只是零件的组装工。
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| * 抽象产品类:定义该类产品的功能 * 奥迪车 */ public abstract class AudiCar{ public abstract void drive(); public abstract void selfNavigation(); } * 抽象工厂类:定义生产某类产品产品线 * 奥迪生产线 */ public abstract class AudiFactory{ public abstract <T extends AudiCar> T createCar(Class<T> clz); }
|
产品的具体类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| * Q3 */ public class AudiQ3 extends AudiCar{ ... } * Q3 */ public class AudiQ5 extends AudiCar{ ... } * Q3 */ public class AudiQ7 extends AudiCar{ ... }
|
建成流水线
1 2 3 4 5 6 7 8 9 10 11 12
| public class AudiCarFactory extends AudiFactory{ @Override public <T extends AudiCar> T createCar(Class<T> clz){ AudiCar car = null; try{ car = (AudiCar)Class.forName(clz.getName()).newInstance(); }catch(Exception e){ e.printStackTrace(); } return (T)car; } }
|
成产
1 2 3 4 5 6 7 8 9 10 11 12
| public class Client{ public static void main(String[] agrs){ AudiFactory factory = new AudiCarFactory(); Class<? extends AudiCar>[] orders = new Class<>[]{AudiQ3.class,AudiQ5.class,AudiQ5.class,AudiQ3.calss,AudiQ7.calss}; for(int i=0,size=orders.lenth; i<size; i++){ AudiCar car = (AudiCar)factory.createCar(orders[i]); } } }
|
解析
工厂方法模式:根据具体产品的类型,构建对应的产品线,生产出对应的产品。
工厂方法模式生产的是一类产品组:例如Audi某型号车的不同车款(入门级,舒适级,豪华级,至尊级)。正如上文对工厂模式的解释,我们不生产零件,我们只是零件的组装工