设计模式-工厂方法模式

工厂方法模式,工厂的父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,即通过不同的工厂子类创建不同的产品对象.

角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

举例:工厂方法是对工厂进行抽象化,即有一个抽象的工厂类负责定义具体的工厂创建方法.如:富士康不在是一个代工厂, 而是一个抽象的工厂,这个抽象的工厂衍生出两个具体的工厂,一个富士康iPhone生产厂,一个富士康miPhone生产厂,iPhone厂负责生产iPhone,miPhone厂负责生产miPhone.

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
// 工厂抽象类
@interface Factory : NSObject

+ (Phone *)createPhone;

@end

@implementation Factory

+ (Phone *)createPhone
{
// 返回抽象的Phone并无意义,因此返回nil
return nil;
}

@end

// iPhone工厂
@interface iPhoneFactory : Factory
@end

@implementation iPhoneFactory

+ (Phone *)createPhone
{
return [iPhone new];
}

@end

// miPhone工厂
@interface miPhoneFactory : Factory
@end

@implementation miPhoneFactory

+ (Phone *)createPhone
{
return [miPhoneFactory new];
}

@end

使用:

1
2
3
4
// 创建苹果手机对象
Phone *phone = [iPhoneFactory createPhone];
// 创建小米手机对象
Phone *mi = [miPhoneFactory createPhone];

对应的结构图如下:

优点:

  • 屏蔽了产品创建的具体细节,用户只需要关心所需产品对应的工厂即可
  • 当有新的产品时,无需修改抽象工厂的方法,只需要添加一个具体的工厂和具体的产品即可,符合开闭原则

缺点:

  • 当系统加入新产品时,需要提供对象的产品类和具体的工厂, 增加了类的个数

总结:

  • 工厂方法解决了简单工厂开闭原则的问题, 另外突出一个动态, 动态仔细品.

(完)