浅谈Java设计模式系列0x03---工厂方法模式

浅谈Java设计模式系列0x00
浅谈Java设计模式系列0x01—单例模式
浅谈Java设计模式系列0x02—简单工厂模式

上次我们讲了简单工厂模式,这次我们来讲一下工厂方法模式;
简单工厂模式是工厂方法模式的一种,有了对简单工厂模式的了解后,对工厂方法模式的理解也就容易多了;

工厂方法模式

相对于简单工厂模式,工厂方法模式将工厂类分为了工厂父类和工厂子类;
工厂父类负责定义创建产品对象的公共接口,工厂子类则负责生成具体的产品对象;
将实例化操作延迟到子类进行,由于工厂方法模式动态创建对象的特点,所有也叫多肽工厂模式;

什么时候能用

  • 当客户端不知道需要的对象的类时,客户端不需要知道具体的产品类的类名,只需知道对应的工厂即可,具体产品由具体工厂创建;
  • 抽象工厂类通过其子类指定创建哪个对象,抽象工厂类只需要提供一个创建产品的接口,由其子类来确定具体要创建的产品对象;

模式结构

  1. Product: 抽象产品
  2. ConcreteProduct: 具体产品
  3. Factory: 抽象工厂
  4. ConcreteFactory: 具体工厂

举个例子

代码参考
我们还是使用上次简单工厂模式的例子,以手机工厂为例;

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* 抽象产品类
*/

public interface Phone {
void call();
}
/**
*具体产品类 Android Phone
*/

public class AndroidPhone implements Phone {
@Override
public void call() {
System.out.println("This is Android Phone calling......");
}
}

/**
* 具体产品类 Apple Phone
*/

public class ApplePhone implements Phone {
@Override
public void call() {
System.out.println("This is Apple Phone calling........");
}
}

/**
* 抽象工厂类
*/

public interface PhoneFactory {
Phone createPhone();
}

/**
* 具体工厂类 Android Factory
*/

public class AndroidFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new AndroidPhone();
}
}

/**
* 具体工厂类 Apple Factory
*/

public class AppleFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new ApplePhone();
}
}
/**
* 测试类
*/

public class Client {
public static void main(String[] args) {
Phone android = new AndroidFactory().createPhone();
android.call();
}

}

上面是一个比较简单的工厂方法模式的例子,当有新的产品要加入时只需添加新的产品类和工厂类即可,而不必去修改之前的代码;
这一点弥补了简单工厂模式的不足,但随着产品的增加会造成类膨胀;

总结

由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好;
也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装;

参考

工厂方法模式
工厂三兄弟之工厂方法模式