python如何代替工厂模式_设计模式Python实现-简单工厂模式

本文详细介绍了简单工厂模式的原理与实现,包括产品接口、具体产品和创建者类的定义。简单工厂模式适用于当代码需要创建多个相关或相互依赖的对象,而不想指定具体类时。它降低了代码的耦合度,同时也提供了扩展性。示例代码展示了如何使用简单工厂模式创建不同产品,并在客户端代码中灵活切换。
摘要由CSDN通过智能技术生成

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

简单工厂模式结构

1264910-20200425175213263-485830234.png

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

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

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

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

1 from __future__ importannotations2 from abc importABC, abstractmethod3

4

5 classCreator(ABC):6 """

7 Creator类声明应该返回产品类的对象的工厂方法。创建者的子类通常提供此方法的实现。使用abstractmethod方式,强制子类必须实现factory_method8 """

9

10 @abstractmethod11 deffactory_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 returnresult29

30

31

32 """

33 具体的创建者重写工厂方法以更改结果产品的类型。34 """

35

36

37 classConcreteCreator1(Creator):38 """

39 具体的生产者重写工厂方法以生产自己的产品。40 具体产品实际上是从该方法返回的41 """

42

43 def factory_method(self) ->ConcreteProduct1:44 returnConcreteProduct1()45

46

47 classConcreteCreator2(Creator):48 def factory_method(self) ->ConcreteProduct2:49 returnConcreteProduct2()50

51

52 classProduct(ABC):53 """

54 产品接口声明所有具体产品必须实现的操作。abstractmethod强制子类实现其装饰的方法55 """

56

57 @abstractmethod58 def operation(self) ->str:59 pass

60

61

62 """

63 具体的产品提供了产品接口的各种实现。64 """

65

66

67 classConcreteProduct1(Product):68 def operation(self) ->str:69 return "{Result from ConcreteProduct1}"

70

71

72 classConcreteProduct2(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())

1264910-20200425175213263-485830234.png

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

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

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

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

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

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

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

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

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

优缺点:

优点:

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

符合单一责任原则

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

缺点:

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

作者:Andy

出处:http://www.cnblogs.com/onepiece-andy/

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值