概念解析
工厂模式,其目的是建立通用的”工厂类”,得到不同类的实例。工厂模式包含三种模式,从简单到高级不断升级:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式:能够根据输入参数不同创建不同类的实例:定义一个创建对象的接口,通过参数来决定创建哪个类的实例。
工厂方法模式:定义一个创建对象的接口:让子类来决定创建哪个类的实例,工厂方法使一个类的实例化延迟到其子类
抽象工厂模式:提供一个创建一系列相关和相互依赖的对象的接口,而无须指定它们的具体类
其三者之间的递进关系为: 简单工厂使用简单,根据不同参数能够创建不同的类对象,但是不易拓展:如果需要添加新的产品类型则需要修改工厂的创建逻辑(不符合开放-封闭原则),适用于简单的明显存在继承关系且类型不多的场景;工厂方法则在简单工厂模式的基础上抽象出了一个父类,并在其基础上添加不同子类负责不同的具体产品;抽象工厂模式则是主要用于二级产品的场景,抽象工厂模式需要进一步抽象产品的共用的属性。
实例分析
场景说明:设计一个白板功能:需要不同类型的画笔,比如直线、矩形、椭圆等,具体实现代码如下:
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
63
64
65
66
from abc import ABCMeta, abstractmethod
from enum import Enum
class PenType(Enum):
"""画笔类型"""
pen_type_line = 1
pen_type_rect = 2
pen_type_ellipse = 3
class Pen(metaclass=ABCMeta):
"""画笔"""
def __init__(self, name):
self.__name = name
@abstractmethod
def get_type(self):
pass
def get_name(self):
return self.__name
class LinePen(Pen):
"""直线画笔"""
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.pen_type_line
class RectanglePen(Pen):
"""矩形画笔"""
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.pen_type_rect
class EllipsePen(Pen):
"""椭圆画笔"""
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.pen_type_ellipse
class PenFactory():
"""创建画笔"""
if self.__pens.get(pen_type) is None:
# 如果该对象不存在,则创建一个对象并存在字典中
if pen_type == PenType.pen_type_line:
pen = LinePen("直线画笔")
elif pen_type == PenType.pen_type_rect:
pen = RectanglePen("矩形画笔")
elif pen_type == PenType.pen_type_ellipse:
pen = EllipsePen("椭圆画笔")
else:
pen = Pen("")
self.__pens[pen_type] = pen
# 否则,直接返回字典中的对象即可
return self.__pens[pen_type]