HeadFirst 设计模式--抽象工厂
当想让产品类与制作产品的原料类集合起来时使用
抽象工厂模式
我们应尽量“要依赖抽象,不要依赖具体类(面向对象的设计原则)”,这又称为‘依赖导致原则’,可将业务类从繁多的类依赖中摆脱出来。
示例
书中通过pizza分店中处理不同风味披萨的例子,介绍了抽象工厂模式的使用。每个披萨的制作过程相同,但是原料不同,通过抽象工厂,为每个pizza店,产生不同的原料类。
from abc import abstractmethod, ABCMeta
class ThinCrustDough:
pass
class MarinaraSauce:
pass
class ReggianoCheese:
pass
class PizzaIngredientFactory:
"""
抽象类
"""
pass
class NYPizzaIngredientFactory(PizzaIngredientFactory):
def create_dough(self):
return ThinCrustDough()
def create_sauce(self):
return MarinaraSauce()
def create_Cheese(self):
return ReggianoCheese()
# 其他方法省略
...
class Pizza(ABCMeta):
name = None
dough = None
sauce = None
Cheese = None
@abstractmethod
def prepare(self):
'''
准备制作pizza的原料
'''
pass
def bake(self):
print("烘焙25-30分钟")
def cut(self):
print("切披萨")
def box(self):
print("包装")
class CheesePizza(Pizza):
name = "奶酪pizza"
ingredientFactory = None
def __init__(self, ingredientFactory):
self.ingredientFactory = ingredientFactory
def prepare(self):
print("正在制作" + self.name)
self.dough = self.ingredientFactory.create_dough()
self.sauce = self.ingredientFactory.create_sauce()
self.Cheese = self.ingredientFactory.create_Cheese()
class PizzaStore:
pizza = None
def __init__(self, pizza_factory):
self.pizza_factory = pizza_factory
def create_pizza(self, pizza_type):
pizza = None
ingredientFactory = NYPizzaIngredientFactory()
if pizza_type == "CheesePizza":
pizza = CheesePizza(ingredientFactory)
return pizza
def order_pizza(self, pizza_type):
pizza = self.create_pizza(pizza_type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return self.pizza
抽象工厂允许客户使用抽象接口创建一组相关的产品,而不需要知道具体的产品是什么,这样客户就从具体的产品中解耦.
工厂方法与抽象工厂的区别:
工厂方法使用的是继承,抽象工厂使用的是接口
工厂方法将依赖的类改为依赖某个产品类的抽象类型,而子类(子类依赖的时类,而非对象),在实例化时,再实例化某个具体产品的类.
抽象工厂创建了一个产品原料的抽象、一组依赖该抽象的产品、一个业务类,要使用这个工厂,需要先实例化它的一个类(原料类),然后将其传入到业务类中,在业务类中,使用该原料类,来生产具体的产品。
使用场景:
抽象工厂:当想让产品类与制作产品的原料类集合起来时使用。
工厂模式:当想让将实例化具体类的代码从具体的类中解耦时使用。
License:
CC BY 4.0