求知若饥,虚心若愚

python风格的抽象工厂模式

抽象工厂模式:

提供一个接口,用户创建多个相关或依赖对象,而不需要指定具体类。

原则:

依赖抽象,不依赖具体类。

实例:

用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(Dough、Sauce、Cheese和Clam)的抽象类型(PizzaIngredientFactory),这个类型的子类(NYPizzaIngredientFactory和ChicagoPizzaIngredientFactory)定义了产品被产生的方法。

工厂模式和抽象工厂模式的区别:

工厂模式是在派生类中定义一个工厂的抽象接口,然后基类负责创建具体对象;抽象工厂模式是维护一个产品家族,由基类定义产品被生产的方法,客户根据派生类的接口进行开发。

代码:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
 
'''
披萨
'''
class Pizza:
    name = ""
    dough = None
    sauce = None
    cheese = None
    clam = None
 
    def prepare(self):
        pass
 
    def bake(self):
        print "烘烤25分钟在350。".decode('utf-8')
 
    def cut(self):
        print "切割成对角线切片。".decode('utf-8')
 
    def box(self):
        print "放在官方的盒子中。".decode('utf-8')
 
    def get_name(self):
        return self.name
 
    def set_name(self, name):
        self.name = name
 
    def to_string(self):
        string = "%s:\n" % self.name
        string += "    面团: %s\n" % self.dough.to_string() if self.dough else ""
        string += "    酱汁: %s\n" % self.sauce.to_string() if self.sauce else ""
        string += "    奶酪: %s\n" % self.cheese.to_string() if self.cheese else ""
        string += "    文蛤: %s\n" % self.clam.to_string() if self.clam else ""
        return string
 
'''
什么类别的披萨
'''
class CheesePizza(Pizza):
    def __init__(self, ingredient_factory):
        self.ingredient_factory = ingredient_factory
 
    def prepare(self):
        print "准备: %s" % self.name
        self.dough = self.ingredient_factory.create_dough()
        self.sauce = self.ingredient_factory.create_sauce()
        self.cheese = self.ingredient_factory.create_cheese()
 
 
class ClamPizza(Pizza):
    def __init__(self, ingredient_factory):
        self.ingredient_factory = ingredient_factory
 
    def prepare(self):
        print "准备: %s" % self.name
        self.dough = self.ingredient_factory.create_dough()
        self.sauce = self.ingredient_factory.create_sauce()
        self.clam = self.ingredient_factory.create_clam()
 
'''
披萨店
'''
class PizzaStore:
    def order_pizza(self, pizza_type):
        self.pizza = self.create_pizza(pizza_type)
        self.pizza.prepare()
        self.pizza.bake()
        self.pizza.cut()
        self.pizza.box()
        return self.pizza
 
    def create_pizza(self, pizza_type):
        pass
 
'''
纽约披萨实体店1
'''
class NYPizzaStore(PizzaStore):
    def create_pizza(self, pizza_type):
        ingredient_factory = NYPizzaIngredientFactory()
 
        if pizza_type == "cheese":
            pizza = CheesePizza(ingredient_factory)
            pizza.set_name("纽约风格芝士披萨".decode('utf-8'))
        elif pizza_type == "clam":
            pizza = ClamPizza(ingredient_factory)
            pizza.set_name("纽约风格文蛤披萨".decode('utf-8'))
        else:
            pizza = None
 
        return pizza
 
'''
芝加哥披萨实体店2
'''
class ChicagoPizzaStore(PizzaStore):
     def create_pizza(self, pizza_type):
        ingredient_factory = ChicagoPizzaIngredientFactory()
 
        if pizza_type == "cheese":
            pizza = CheesePizza(ingredient_factory)
            pizza.set_name("芝加哥风格芝士披萨".decode('utf-8'))
        elif pizza_type == "clam":
            pizza = ClamPizza(ingredient_factory)
            pizza.set_name("芝加哥风格文蛤披萨".decode('utf-8'))
        else:
            pizza = None
 
        return pizza
 
'''
生产披萨的工厂
'''
class PizzaIngredientFactory:
    def create_dough(self):
        pass
 
    def create_sauce(self):
        pass
 
    def create_cheese(self):
        pass
 
    def create_clam(self):
        pass
 
'''
生产披萨的实体工厂1
'''
class NYPizzaIngredientFactory(PizzaIngredientFactory):
    def create_dough(self):
        return ThinDough()
 
    def create_sauce(self):
        return MarinaraSauce()
 
    def create_cheese(self):
        return FreshCheese()
 
    def create_clam(self):
        return FreshClam()
 
'''
生产披萨的实体工厂2
'''
class ChicagoPizzaIngredientFactory(PizzaIngredientFactory):
    def create_dough(self):
        return ThickDough()
 
    def create_sauce(self):
        return MushroomSauce()
 
    def create_cheese(self):
        return BlueCheese()
 
    def create_clam(self):
        return FrozenClam()
 
 
class Dough:
    def to_string(self):
        pass
 
class ThinDough(Dough):
    def to_string(self):
        return "薄的面团"
 
class ThickDough(Dough):
    def to_string(self):
        return "厚的生面团"
 
class Sauce:
    def to_string(self):
        pass
 
class MarinaraSauce(Sauce):
    def to_string(self):
        return "番茄酱"
 
class MushroomSauce(Sauce):
    def to_string(self):
        return "蘑菇酱"
 
class Cheese:
    def to_string(self):
        pass
 
class FreshCheese(Cheese):
    def to_string(self):
        return "新鲜的奶酪"
 
class BlueCheese(Cheese):
    def to_string(self):
        return "蓝纹奶酪"
 
class Clam:
    def to_string(self):
        pass
 
class FreshClam(Clam):
    def to_string(self):
        return "新鲜的文蛤"
 
class FrozenClam(Clam):
    def to_string(self):
        return "冷冻的文蛤"
 
if __name__ == "__main__":
    # 创建了两个披萨实体店
    ny_store = NYPizzaStore()
    chicago_store = ChicagoPizzaStore()
 
    # 在第一个披萨对象中订购了一个cheese风味的披萨
    pizza = ny_store.order_pizza("cheese")
    print pizza.to_string()
    print "迈克订购了一个 %s" % pizza.get_name()
    print
 
    pizza = chicago_store.order_pizza("clam")
    print pizza.to_string()
    print "约翰订购了一个%s" % pizza.get_name()
    print

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
准备: 纽约风格芝士披萨
烘烤25分钟在350
切割成对角线切片。
放在官方的盒子中。
纽约风格芝士披萨:
    面团: 薄的面团
    酱汁: 番茄酱
    奶酪: 新鲜的奶酪
 
迈克订购了一个 纽约风格芝士披萨
 
准备: 芝加哥风格文蛤披萨
烘烤25分钟在350
切割成对角线切片。
放在官方的盒子中。
芝加哥风格文蛤披萨:
    面团: 厚的生面团
    酱汁: 蘑菇酱
    文蛤: 冷冻的文蛤
 
约翰订购了一个芝加哥风格文蛤披萨

 

posted @   初行  阅读(2510)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

点击右上角即可分享
微信分享提示