zoukankan      html  css  js  c++  java
  • 设计模式Python实现-简单工厂模式

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

    简单工厂模式结构

    Product 产品声明接口,创建者及其子类生成的所有对象都通用

    Concrete ProductA/B是产品接口的不同实现

    Creator 创建者声明工厂方法,此方法返回的类型必须与产品接口匹配,可以将工厂方法声明为抽象方法,强制其子类必须实现自己的方法

    ConcreteCreatorA/B 重写工厂方法,以便返回不同的产品

     1 from __future__ import annotations
     2 from abc import ABC, abstractmethod
     3 
     4 
     5 class Creator(ABC):
     6     """
     7     Creator类声明应该返回产品类的对象的工厂方法。创建者的子类通常提供此方法的实现。使用abstractmethod方式,强制子类必须实现factory_method
     8     """
     9 
    10     @abstractmethod
    11     def factory_method(self):
    12         """
    13         创建者可以提供factory方法的一些默认实现。
    14         """
    15         pass
    16 
    17     def some_operation(self) -> str:
    18         """
    19         不关心是谁创建的产品,写了自己的业务,子类可以重写
    20         """
    21 
    22         # 调用工厂方法,创建一个产品
    23         product = self.factory_method()
    24 
    25         # 使用产品,不关心产品类型
    26         result = f"创建者不关心产品类型, {product.operation()}"
    27 
    28         return result
    29 
    30 
    31 
    32 """
    33 具体的创建者重写工厂方法以更改结果产品的类型。
    34 """
    35 
    36 
    37 class ConcreteCreator1(Creator):
    38     """
    39     具体的生产者重写工厂方法以生产自己的产品。
    40     具体产品实际上是从该方法返回的
    41     """
    42 
    43     def factory_method(self) -> ConcreteProduct1:
    44         return ConcreteProduct1()
    45 
    46 
    47 class ConcreteCreator2(Creator):
    48     def factory_method(self) -> ConcreteProduct2:
    49         return ConcreteProduct2()
    50 
    51 
    52 class Product(ABC):
    53     """
    54     产品接口声明所有具体产品必须实现的操作。abstractmethod强制子类实现其装饰的方法
    55     """
    56 
    57     @abstractmethod
    58     def operation(self) -> str:
    59         pass
    60 
    61 
    62 """
    63 具体的产品提供了产品接口的各种实现。
    64 """
    65 
    66 
    67 class ConcreteProduct1(Product):
    68     def operation(self) -> str:
    69         return "{Result from ConcreteProduct1}"
    70 
    71 
    72 class ConcreteProduct2(Product):
    73     def operation(self) -> str:
    74         return "{Result from ConcreteProduct2}"
    75 
    76 
    77 def client_code(creator: Creator) -> None:
    78     """
    79     客户端和具体生产者绑定,就可以获得不同的产品,不用关心具体的创建者是谁
    80     """
    81 
    82     print(f"client_code不在乎具体创建者
    "
    83           f"{creator.some_operation()}", end="")
    84 
    85 
    86 if __name__ == "__main__":
    87     print("ConcreteCreator1")
    88     client_code(ConcreteCreator1())
    89     print("
    ")
    90 
    91     print("ConcreteCreator2")
    92     client_code(ConcreteCreator2())

    Product 产品声明接口,创建者及其子类生成的所有对象都通用

    Concrete ProductA/B是产品接口的不同实现

    Creator 创建者声明工厂方法,此方法返回的类型必须与产品接口匹配,可以将工厂方法声明为抽象方法,强制其子类必须实现自己的方法

    ConcreteCreatorA/B 重写工厂方法,以便返回不同的产品

    有哪些场景适合简单工厂模式呢?

    在处理大型的资源密集型对象(例如数据库连接,文件系统和网络资源)时

    事先不知道代码应使用的对象的确切类型和依赖关系时

    要为库或框架的用户提供扩展其内部组件的方法时

    想通过重用现有对象而不是每次都重建它们来节省系统资源时

    优缺点:

    优点:

    可以避免创建者与具体产品之间的紧密耦合。

    符合单一责任原则

    符合开放/封闭原则,不破坏现有客户端代码,从而增加产品

    缺点:

    引入许多新的子类来实现该模式,因此代码可能变得更加复杂


    作者:Andy
    出处:http://www.cnblogs.com/onepiece-andy/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    【转】PHP操作MongoDB【NoSQL】
    web前端响应式
    CSS Hack
    ES6特性
    zepto.js使用前注意
    移动端 isScroll自定义实现
    严格模式use strict
    node.js和express.js安装和使用步骤 [windows]
    JSONP理解和使用
    require.js+backbone.js基本使用
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-simple-factory-pattern.html
Copyright © 2011-2022 走看看