工厂方法模式定义
工厂方法模式(Factory Method Pattern)又称工厂模式,它属于类创建型模式。在工厂模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式由来
工厂方法模式是对简单工厂模式进一步抽象,我们会定义抽象的汽车工厂类,在定义具体的工厂类来生产对应的汽车,工厂抽象类的方式会使这种结构可以在不修改具体工厂类的情况下引进新的产品,这样无疑使得工厂模式具有超越简单工厂模式的优越性,符合开闭原则。
工厂方法模式结构
-
Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
-
ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
-
Factory:抽象工厂角色
抽象工厂角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
-
ConcreteFactory:具体工厂角色
具体工厂角色负责实现创建所有实例的内部逻辑
工厂方法模式案例
我们针对简单工厂模式对汽车工厂类进行抽象化,具体实现如下:
1、抽象产品角色
1
2
3
4
abstract class ICar {
// 汽车运行
void run();
}
2、具体产品角色
1
2
3
4
5
6
7
8
9
10
11
12
13
class BenZ implements ICar {
@override
void run() {
print("奔驰汽车运行");
}
}
class Bmw implements ICar {
@override
void run() {
print('宝马汽车运行');
}
}
3、抽象工厂角色
1
2
3
4
abstract class ICarFactory {
// 生产汽车接口
ICar createCar();
}
4、具体工厂角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 奔驰汽车工厂
class BenZCarFactory implements ICarFactory {
@override
ICar createCar() {
print("生产奔驰汽车");
return BenZ();
}
}
// 宝马汽车工厂
class BmwCarFactory implements ICarFactory {
@override
ICar createCar() {
print("生产宝马汽车");
return Bmw();
}
}
5、使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main(List<String> args) {
// 奔驰工厂
BenZCarFactory benZCarFactory = BenZCarFactory();
// 奔驰车
ICar benZCar = benZCarFactory.createCar();
// 奔驰车运行
benZCar.run();
// 宝马工厂
BmwCarFactory bmwCarFactory = BmwCarFactory();
// 宝马车
ICar bmwCar = bmwCarFactory.createCar();
// 宝马车运行
bmwCar.run();
}
6、运行结果
1
2
3
4
5
6
Connecting to VM Service at http://127.0.0.1:51316/Akg37TgEIgs=/
生产奔驰汽车
奔驰汽车运行
生产宝马汽车
宝马汽车运行
Exited
7、完整代码
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
void main(List<String> args) {
// 奔驰工厂
BenZCarFactory benZCarFactory = BenZCarFactory();
// 奔驰车
ICar benZCar = benZCarFactory.createCar();
// 奔驰车运行
benZCar.run();
// 宝马工厂
BmwCarFactory bmwCarFactory = BmwCarFactory();
// 宝马车
ICar bmwCar = bmwCarFactory.createCar();
// 宝马车运行
bmwCar.run();
}
abstract class ICar {
// 汽车运行
void run();
}
class BenZ implements ICar {
@override
void run() {
print("奔驰汽车运行");
}
}
class Bmw implements ICar {
@override
void run() {
print('宝马汽车运行');
}
}
abstract class ICarFactory {
// 生产汽车接口
ICar createCar();
}
// 奔驰汽车工厂
class BenZCarFactory implements ICarFactory {
@override
ICar createCar() {
print("生产奔驰汽车");
return BenZ();
}
}
// 宝马汽车工厂
class BmwCarFactory implements ICarFactory {
@override
ICar createCar() {
print("生产宝马汽车");
return Bmw();
}
}
8、分析
我们通过对工厂类抽象的方式,让子类去决定实例化哪一个类,这样使得类的实例化能延迟到子类运行,而且这个如果需要新增产品,无需修改现有代码,符合开闭原则。
总结
工厂方法模式优点
- 对象的创建只需要关心所需产品对应的工厂,无需关心创建细节
- 新增产品类时,无需修改现有代码、扩展方便、灵活性高
工厂方法模式缺点
- 代码量显著增加、一定程度上增加了系统的复杂度