再读斋

Android设计模式(四)工厂方法模式

介绍

工厂方法模式是创建型设计模式之一。工厂方法模式是一种结构简单的模式。

定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂对象。

UML类图

UML类图如下:

这里的角色主要分为四个模块:

  1. 抽象工厂Factory,其为工厂方法的核心;
  2. 具体工厂ConcreteFactory,实现了具体的业务逻辑;
  3. 抽象产品Product,是工厂方法模式所创建的产品的父类;
  4. 具体产品ConcreteFactory,实现抽象产品的某个具体产品的对象;

实现

小明是一家汽车厂的厂长,对他来说,组装汽车就是讲一些进口的核心部件,比如发动机和一些零部件组装起来,小明的汽车厂主要组装某款SUV车型,比如Q3、Q5,对于这类车型来说内部结构差异并不是很大,因此小明只需要一条生产线就足以应付这2种车型,对于该类生产线小明提供一个抽象类定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 抽象生产线类
* @author Administrator
*
*/
public abstract class AudiFactory {
/**
* 某车型的工厂方法
* @param clz 具体的车型类
* @return 具体型号的车对象
*/
public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}

生产线的具体实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 生产线具体类
* @author Administrator
*
*/
public class AudiCarFactory extends AudiFactory{
@Override
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
// TODO Auto-generated method stub
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
// TODO: handle exception
}
return (T) car;
}
}

对于这两种车型,除了一些车的基本共性之外,还提供了自动导航功能,这些都使用一个抽象的基本类来声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 汽车的抽象产品类
* @author Administrator
*
*/
public abstract class AudiCar {
/**
* 行为方法,车可以驾驶
*/
public abstract void drive();
/**
* 行为方法,车可以自动导航
*/
public abstract void selfNavigation();
}

接下来就是具体的车型了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class AudiQ3 extends AudiCar {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Q3 run");
}
@Override
public void selfNavigation() {
// TODO Auto-generated method stub
System.out.println("Q3 navi");
}
}
public class AudiQ5 extends AudiCar {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Q5 run");
}
@Override
public void selfNavigation() {
// TODO Auto-generated method stub
System.out.println("Q5 navi");
}
}

最后我们将各个类组装起来形成一条完整的流水线:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Client {
public static void main(String[] args) {
AudiFactory factory = new AudiCarFactory();
AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();
AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();
}
}
结果打印:
Q3 run
Q3 navi
Q5 run
Q5 navi

总结

总的来说,工厂方法模式是一个很好的设计模式,但是也存在缺点,就是每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然导致类结构的复杂化,所以工作中需要权衡。

刘涤生 wechat