一. 什么是工厂模式
工厂模式是一种创建对象的设计模式,它通过使用工厂方法来实例化对象,从而在代码中提供了更大的灵活性和可维护性。
在工厂模式中,我们定义一个工厂类,该类负责创建对象的实例。这样,我们可以通过工厂类来创建具体的对象,而不需要直接在代码中实例化对象。这种方式允许我们根据需要动态地选择要创建的对象类型,而不需要显式指定具体的类。
二. 工厂模式分类
简单工厂模式(Simple Factory Pattern)
-
简介
简单工厂模式是最基本的工厂模式,由一个工厂类负责根据参数来创建相应的产品对象。这个工厂类通常包含一个静态方法或函数,根据传入的参数决定创建哪种产品对象。 -
例子
class Pizza:
def prepare(self):
pass
def bake(self):
pass
def cut(self):
pass
def box(self):
pass
class CheesePizza(Pizza):
def prepare(self):
print("准备芝士披萨")
class PepperoniPizza(Pizza):
def prepare(self):
print("准备意大利辣香肠披萨")
class PizzaFactory:
def create_pizza(self, pizza_type):
if pizza_type == "cheese":
return CheesePizza()
elif pizza_type == "pepperoni":
return PepperoniPizza()
else:
raise ValueError("不支持的披萨类型")
# 使用简单工厂模式创建披萨
pizza_factory = PizzaFactory()
cheese_pizza = pizza_factory.create_pizza("cheese")
pepperoni_pizza = pizza_factory.create_pizza("pepperoni")
cheese_pizza.prepare() # 输出:准备芝士披萨
pepperoni_pizza.prepare() # 输出:准备意大利辣香肠披萨
工厂方法模式(Factory Method Pattern)
-
简介
工厂方法模式定义了一个抽象的工厂类,该类提供一个创建对象的抽象方法。具体的产品类继承自抽象工厂类,并实现了工厂方法,用于创建具体的产品对象。每个具体的产品类都有对应的具体工厂类来创建该产品对象。 -
例子
class Pizza:
def prepare(self):
pass
def bake(self):
pass
def cut(self):
pass
def box(self):
pass
class CheesePizza(Pizza):
def prepare(self):
print("准备芝士披萨")
class PepperoniPizza(Pizza):
def prepare(self):
print("准备意大利辣香肠披萨")
class PizzaStore:
def create_pizza(self, pizza_type):
pass
def order_pizza(self, pizza_type):
pizza = self.create_pizza(pizza_type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
class NYStylePizzaStore(PizzaStore):
def create_pizza(self, pizza_type):
if pizza_type == "cheese":
return CheesePizza()
elif pizza_type == "pepperoni":
return PepperoniPizza()
else:
raise ValueError("不支持的披萨类型")
# 使用工厂方法模式创建披萨
ny_pizza_store = NYStylePizzaStore()
cheese_pizza = ny_pizza_store.order_pizza("cheese")
pepperoni_pizza = ny_pizza_store.order_pizza("pepperoni")
cheese_pizza.prepare() # 输出:准备芝士披萨
pepperoni_pizza.prepare() # 输出:准备意大利辣香肠披萨
抽象工厂模式(Abstract Factory Pattern)
-
简介
抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体的类。抽象工厂定义了一组抽象方法,每个方法对应创建某种类型的产品对象。具体的工厂类实现了抽象工厂,并负责创建一组相关的产品对象。 -
例子
class Pizza:
def prepare(self):
pass
def bake(self):
pass
def cut(self):
pass
def box(self):
pass
class CheesePizza(Pizza):
def prepare(self):
print("准备芝士披萨")
class PepperoniPizza(Pizza):
def prepare(self):
print("准备意大利辣香肠披萨")
class PizzaIngredientFactory:
def create_dough(self):
pass
def create_sauce(self):
pass
def create_cheese(self):
pass
class NYPizzaIngredientFactory(PizzaIngredientFactory):
def create_dough(self):
return "薄面团"
def create_sauce(self):
return "番茄酱"
def create_cheese(self):
return "纽约芝士"
class PizzaStore:
def create_pizza(self, pizza_type):
pass
def order_pizza(self, pizza_type):
pizza = self.create_pizza(pizza_type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
class NYStylePizzaStore(PizzaStore):
def create_pizza(self, pizza_type):
ingredient_factory = NYPizzaIngredientFactory()
if pizza_type == "cheese":
return CheesePizza(ingredient_factory)
elif pizza_type == "pepperoni":
return PepperoniPizza(ingredient_factory)
else:
raise ValueError("不支持的披萨类型")
# 使用抽象工厂模式创建披萨
ny_pizza_store = NYStylePizzaStore()
cheese_pizza = ny_pizza_store.order_pizza("cheese")
pepperoni_pizza = ny_pizza_store.order_pizza("pepperoni")
cheese_pizza.prepare() # 输出:准备芝士披萨
pepperoni_pizza.prepare() # 输出:准备意大利辣香肠披萨