Posts 设计模式-工厂模式
Post
Cancel

设计模式-工厂模式

概念解析

工厂模式,其目的是建立通用的”工厂类”,得到不同类的实例。工厂模式包含三种模式,从简单到高级不断升级:简单工厂模式、工厂方法模式、抽象工厂模式。

  • 简单工厂模式:能够根据输入参数不同创建不同类的实例:定义一个创建对象的接口,通过参数来决定创建哪个类的实例。

    img

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

    img

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

    img

其三者之间的递进关系为: 简单工厂使用简单,根据不同参数能够创建不同的类对象,但是不易拓展:如果需要添加新的产品类型则需要修改工厂的创建逻辑(不符合开放-封闭原则),适用于简单的明显存在继承关系且类型不多的场景;工厂方法则在简单工厂模式的基础上抽象出了一个父类,并在其基础上添加不同子类负责不同的具体产品;抽象工厂模式则是主要用于二级产品的场景,抽象工厂模式需要进一步抽象产品的共用的属性。

实例分析

场景说明:设计一个白板功能:需要不同类型的画笔,比如直线、矩形、椭圆等,具体实现代码如下:

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]
This post is licensed under CC BY 4.0 by the author.

设计模式-策略模式

设计模式-命令模式