设计模式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不在乎具体创建者\n" 83 f"{creator.some_operation()}", end="") 84 85 86 if __name__ == "__main__": 87 print("ConcreteCreator1") 88 client_code(ConcreteCreator1()) 89 print("\n") 90 91 print("ConcreteCreator2") 92 client_code(ConcreteCreator2())
Product 产品声明接口,创建者及其子类生成的所有对象都通用
Concrete ProductA/B是产品接口的不同实现
Creator 创建者声明工厂方法,此方法返回的类型必须与产品接口匹配,可以将工厂方法声明为抽象方法,强制其子类必须实现自己的方法
ConcreteCreatorA/B 重写工厂方法,以便返回不同的产品
有哪些场景适合简单工厂模式呢?
在处理大型的资源密集型对象(例如数据库连接,文件系统和网络资源)时
事先不知道代码应使用的对象的确切类型和依赖关系时
要为库或框架的用户提供扩展其内部组件的方法时
想通过重用现有对象而不是每次都重建它们来节省系统资源时
优缺点:
优点:
可以避免创建者与具体产品之间的紧密耦合。
符合单一责任原则
符合开放/封闭原则,不破坏现有客户端代码,从而增加产品
缺点:
引入许多新的子类来实现该模式,因此代码可能变得更加复杂
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。