设计模式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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

posted @ 2017-10-30 10:14  Andy冉明  阅读(3151)  评论(0编辑  收藏  举报