盒子
盒子
文章目录
  1. 1. 工厂方法模式的定义
  2. 2. 工厂方法模式的实现
    1. 2.1 厂长小明的幸福人生
      1. 源码
      2. 解析

Android 设计模式:(五)工厂方法模式

前言
本文是对《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{
//生产Audi类车
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某型号车的不同车款(入门级,舒适级,豪华级,至尊级)。正如上文对工厂模式的解释,我们不生产零件,我们只是零件的组装工

扫描加群
好好学习,天天向上!