概念解析
工厂模式,其目的是建立通用的”工厂类”,得到不同类的实例。工厂模式包含三种模式,从简单到高级不断升级:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式:能够根据输入参数不同创建不同类的实例:定义一个创建对象的接口,通过参数来决定创建哪个类的实例。

工厂方法模式:定义一个创建对象的接口:让子类来决定创建哪个类的实例,工厂方法使一个类的实例化延迟到其子类

抽象工厂模式:提供一个创建一系列相关和相互依赖的对象的接口,而无须指定它们的具体类

其三者之间的递进关系为: 简单工厂使用简单,根据不同参数能够创建不同的类对象,但是不易拓展:如果需要添加新的产品类型则需要修改工厂的创建逻辑(不符合开放-封闭原则),适用于简单的明显存在继承关系且类型不多的场景;工厂方法则在简单工厂模式的基础上抽象出了一个父类,并在其基础上添加不同子类负责不同的具体产品;抽象工厂模式则是主要用于二级产品的场景,抽象工厂模式需要进一步抽象产品的共用的属性。
实例分析
场景说明:设计一个白板功能:需要不同类型的画笔,比如直线、矩形、椭圆等,具体实现代码如下:
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]


