简单工厂模式的不足

简单工厂模式中只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。但是最大的缺点就是每当有新产品要加入到系统中,必须修改工厂类。也就是违背了开闭原则,而工厂方法模式可以很好的解决这一问题

工厂方法模式

在简单工厂模式基础上修改,不在设计一个工厂类来统一负责所有产品的创建。而是由具体的工厂来创建具体的产品,也就是说需要定义抽象产品类和抽象工厂类

类图示例

工厂方法模式.png

举个例子

假设需要生产电视机,有不同的品牌的电视机

代码实现

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
//抽象产品TV
interface TV{
public void display();
}

//具体产品HaierTV类
class HaierTV implements TV{
public void display(){
System.out.println("Haier TV is displaying");
}
}

//具体产品HisenseTV类
class HisenseTV implements TV{
public void display(){
System.out.println("Hisense TV is displaying");
}
}

//抽象工厂类TVFactory
interface TVFactory{
public TV getTV();
}

//HaierTV工厂
class HaierTVFactory implements TVFactory{
public TV getTV(){
return new HaierTV();
}
}

//HisenseTV工厂
class HisenseTVFactory implements TVFactory{
public TV getTV(){
return new HisenseTV();
}
}

public class FactoryMethod {
public static void main(String[] args) {
TVFactory haierFactory = new HaierTVFactory();
TV tv1=haierFactory.getTV();
tv1.display();
TVFactory hisenseFactory = new HisenseTVFactory();
TV tv2=hisenseFactory.getTV();
tv2.display();
}
}

该例子的类图示例

TV工厂.png

工厂方法模式包含如下角色

  1. Factory(抽象工厂),声明了工厂方法,用于返回一个产品。与应用程序无关。任何在模式中创建对象的工厂类都必须实现此接口
  2. ConcreteFactory(具体工厂),实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例
  3. Product(抽象产品),抽象产品角色是工厂方法模式所创建的所有对象的父类,也就是产品对象的共同父类或接口
  4. ConcreteProduct(具体产品角色),具体产品实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们之间一一对应

模式分析

工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品