python设计模式之工厂模式

一. 什么是工厂模式

工厂模式是一种创建对象的设计模式,它通过使用工厂方法来实例化对象,从而在代码中提供了更大的灵活性和可维护性。
在工厂模式中,我们定义一个工厂类,该类负责创建对象的实例。这样,我们可以通过工厂类来创建具体的对象,而不需要直接在代码中实例化对象。这种方式允许我们根据需要动态地选择要创建的对象类型,而不需要显式指定具体的类。

二. 工厂模式分类

简单工厂模式(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()  # 输出:准备意大利辣香肠披萨

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值