• Python中的设计模式 -- 工厂模式


    541802157bb7a383f13fa75a9467334d.png

    迷途小书童

    读完需要

    4

    分钟

    速读仅需 2 分钟

    当我们谈到工厂模式时,可以想象一个披萨店,它根据顾客的需求制作不同种类的披萨。顾客只需要告诉披萨店他们想要的披萨类型,而不需要知道披萨是如何制作的。这个披萨店就是一个披萨的工厂,它根据顾客的需求生产不同种类的披萨。

    在 Python 中,工厂模式用于创建对象,而不需要直接调用对象的构造函数。它提供了一种灵活的方式来创建对象,使代码更易于扩展和维护。

    让我们通过一个例子来理解工厂模式的原理。假设我们有一个名为 Pizza 的基类,它定义了披萨的通用行为。然后,我们有几个不同类型的披萨类,如 CheesePizza、PepperoniPizza 和 VeggiePizza,它们都继承自 Pizza 类。

    1. class Pizza:
    2. def prepare(self):
    3. pass
    4. def bake(self):
    5. pass
    6. def cut(self):
    7. pass
    8. def box(self):
    9. pass
    10. class CheesePizza(Pizza):
    11. def prepare(self):
    12. print("Preparing cheese pizza...")
    13. class PepperoniPizza(Pizza):
    14. def prepare(self):
    15. print("Preparing pepperoni pizza...")
    16. class VeggiePizza(Pizza):
    17. def prepare(self):
    18. print("Preparing veggie pizza...")

    在这个例子中,Pizza 类是一个基类,它定义了披萨的通用行为,如 prepare、bake、cut 和 box。每个具体的披萨类都实现了这些方法,以便根据披萨类型进行适当的准备。

    现在,我们创建一个披萨工厂类 PizzaFactory,它根据顾客的需求创建不同类型的披萨。

    1. class PizzaFactory:
    2. def create_pizza(self, pizza_type):
    3. if pizza_type == "cheese":
    4. return CheesePizza()
    5. elif pizza_type == "pepperoni":
    6. return PepperoniPizza()
    7. elif pizza_type == "veggie":
    8. return VeggiePizza()
    9. else:
    10. raise ValueError("Invalid pizza type.")

    在这个例子中,PizzaFactory 类有一个 create_pizza 方法,它接收一个披萨类型作为参数,并根据类型返回相应的披萨实例。如果传入的披萨类型无效,它会引发一个值错误。

    现在,我们可以使用披萨工厂来创建不同类型的披萨

    1. factory = PizzaFactory()
    2. pizza1 = factory.create_pizza("cheese")
    3. pizza1.prepare() # 输出: Preparing cheese pizza...
    4. pizza2 = factory.create_pizza("pepperoni")
    5. pizza2.prepare() # 输出: Preparing pepperoni pizza...
    6. pizza3 = factory.create_pizza("veggie")
    7. pizza3.prepare() # 输出: Preparing veggie pizza...

    通过使用披萨工厂,我们可以根据顾客的需求创建不同类型的披萨,而不需要直接调用披萨类的构造函数,这使得我们的代码更加灵活和可扩展。

    需要注意的是,工厂模式可以帮助我们封装对象的创建过程,但它并不是万能的。在某些情况下,可能需要使用其他设计模式来更好地解决问题。因此,在使用工厂模式时,需要根据具体情况进行评估和选择。

    a9bdfe835729843c4fd6759df5da99dd.jpeg

    7387aa4dd8a494fa7990c6b6c6e7250a.gif

  • 相关阅读:
    [论文阅读] 颜色迁移-N维pdf迁移
    2023年【陕西省安全员C证】最新解析及陕西省安全员C证试题及解析
    javascript_forEach踩坑
    Mysql — 刷题知识点
    程序员网上接单盛行,到底该怎样选择一个好用不坑的接单平台?
    品牌维权服务可覆盖哪些平台
    Windows和Linux上使用Prometheus+Grafana监控Springboot
    软考 ----- UML设计与分析(下)
    InputMethodManager输入法窗口为啥dumpsys是全屏?千里马带你疑难解惑输入法相关
    国内低代码开发平台,哪个更值得一试?
  • 原文地址:https://blog.csdn.net/djstavaV/article/details/133327999