前言

在《设计模式》一书中工厂模式提到了:

工厂方法模式(Factory Method)

抽象工厂模式 (Abstract Factory)

但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple

Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为

工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。

工厂意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

别名

虚构造器(Virtual Constructor)

案例

第一阶段

小李开了一个代工厂,专门帮各大厂商生产手机,一开始只有小米找他生产小米手机(MiPhone),后来质量过硬,声名远播,苹果公司也找上门了,准备让他生产苹果手机,生意来了,小李小手一挥,停工几个月,加了一个生产线专门生成苹果手机(Iphone)。于是乎,现在一个工厂有两个生产线。

第一阶段 UML 图

让我们借助 UML 图直观了解一下工厂现在的样子。

第一阶段代码

通过代码去实现这个逻辑

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35from abcimport ABC, abstractmethod

# 手机

class Phone(ABC):

@abstractmethod

def make(self):

pass

# 苹果手机

class Apple(Phone):

def make(self):

print("make apple")

# 小米手机

class XiaoMi(Phone):

def make(self):

print("make xiaomi")

class Factory:

def product_phone(self, mobile_type):

if mobile_type== 'apple':

return Apple()

else:

return XiaoMi()

if __name__== '__main__':

factory= Factory()

factory.product_phone('apple').make()

factory.product_phone('xiaomi').make()

看一下运行结果:

make apple

make xiaomi

第二阶段

随着第一阶段的订单完成,现在越来越多的手机厂商来找小李来生产手机,问题来了,生产线改造需要导致整个工厂停工一段时间,每次停工对工厂来说都是巨大的损失。那么该怎么解决问题呢?一个工厂似乎不够用了,那么该怎么解决呢?

把所有的生产线独立出来到单独的工厂,这样子需要生产新的手机只需要新增新的工厂就好了,不会影响其他的手机的生产。

第二阶段 UML 图

同样让我们借助 UML 图了解一下这个阶段工厂的样子吧。

第二阶段代码

同样让我们借助代码去实现这一阶段的逻辑

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49from abcimport ABC, abstractmethod

# 抽象工厂

class AbastractFactory(ABC):

@abstractmethod

def product_phone(self):

pass

# 苹果工厂

class AppleFactory(AbastractFactory):

def product_phone(self):

return Apple().make()

# 小米工厂

class XiaomiFactory(AbastractFactory):

def product_phone(self):

return XiaoMi().make()

# 生产线

class Phone(ABC):

@abstractmethod

def make(self):

pass

# 苹果生产线

class Apple(Phone):

def make(self):

print("make apple")

# 小米生产线

class XiaoMi(Phone):

def make(self):

print("make xiaomi")

def client_product(factory:AbastractFactory):

return factory

if __name__== '__main__':

xiaomi= client_product(XiaomiFactory())

xiaomi.product_phone()

apple= client_product(AppleFactory())

apple.product_phone()

看一下运行结果:

make xiaomi

make apple

总结

上面的案例中的俩个阶段分别对应了两个设计模式,分别是:**简单工厂模式 **和 工厂方法模式。通过案例和对比,我们不难发现它们的的优缺点。

简单工厂模式优缺点

优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。

缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

工厂方法模式优缺点

优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品

缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类

python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点相关推荐

  1. python缺少动态库libpython_浅析python 动态库m.so.1.0错误问题

    $ python -V python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared o ...

  2. python 字符编码处理_浅析Python 字符编码与文件处理

    Python字符编码 目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk. python2默认的字符编码方式是ASCII python3默认的字符编码方式是Un ...

  3. python pdf脚本之家_Python实现简单拆分PDF文件的方法

    本文实例讲述了Python实现简单拆分PDF文件的方法.分享给大家供大家参考.具体如下: 依赖pyPdf处理PDF文件 切分pdf文件 使用方法: 1)将要切分的文件放在input_dir目录下 2) ...

  4. python解释器详解_浅析Python解释器的设计(一)

    一些铺垫(扯淡) 历史上,在Python 2.4以及之前的版本,py代码的执行,也就是从源码到bytecode分为两步: 解析py源码成为分析树 (Parser/pgen.c)基于分析树优化缩减byt ...

  5. python 小括号 运算_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

  6. python中括号的作用_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

  7. python代替javascript_取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言

    对于开发人员来说,哪些编程语言最受欢迎?哪些框架.包.函数和方法被提问的次数最多?哪种数据类型使用起来最痛苦?各个编程语言之间的问题有何不同?--本文中汇总了数百万个各个开发领域内的不同问题,挑选了1 ...

  8. python查看图片的gps_浅析python中获取图片中exif中的gps方法

    现在很多手机都支援在照片中的exif中存储位置gps信息了,不过有时假如我们想在在线地图中定位照片中却犯了难,windows或acdsee显示的都是度分秒的方式,不能复制也不适宜得到到在线地图中定位, ...

  9. python继承问题_深入浅析python继承问题

    有如下的代码: class p1: def __init__(self,a,b): print("init in p1") self.a1=a self.b1=b self.f1( ...

最新文章

  1. 经典C语言程序100例之四四
  2. wordpress插件-WP Rocket 3.10.1_去广告已授权
  3. 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性...
  4. LINUX线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量等
  5. 95-30-015-Channel-AbstractNioMessageChannel
  6. HALCON 20.11:深度学习笔记(11)---目标检测
  7. VM虚拟机Bridge模式VMnet0网卡无法启动问题的解决
  8. 【JAVA笔记——器】Spring MVC + HATEOAS RestFul快速搭建
  9. 让 Alfred 支持拼音
  10. ADS1115的IIC通信
  11. linux 效果器软件下载,盘点丨15款免费又好用的音乐制作软件
  12. 设置标题栏背景色,背景色是自定义背景色
  13. Hot and cold pages
  14. 管理员同志,回收站博文希望得到恢复,万分感谢
  15. 上层应用程序是如何访问到底层驱动程序的呢?
  16. 西门子PLC中DB与DI有什么区别
  17. Python 的文件路径和操作(一)
  18. linux或者UC/OS
  19. liunx安装node
  20. android 购物车实现,Android Studio实现简单购物车功能

热门文章

  1. apache php日志配置,HTML_初学:apache与php基本配置,1、APACHE的日志主要分为“ - phpStudy...
  2. 点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能
  3. 计算机主机的主要包括,微型计算机的主机主要包括
  4. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...
  5. 群晖服务器性能测试,对群晖DS716+进行性能测试_群晖 DS716+_企业存储技术与评测-中关村在线...
  6. Java 判断目录是否为空
  7. linux代码_Sonar代码走查的配置(linux)
  8. 爬虫4-正则表达式及Python的re模块
  9. Python递归通用接口响应深层提取
  10. 【Python】time内置模块处理时间信息