python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点
前言
在《设计模式》一书中工厂模式提到了:
工厂方法模式(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 简单工厂模式和工厂方法模式的优缺点相关推荐
- python缺少动态库libpython_浅析python 动态库m.so.1.0错误问题
$ python -V python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared o ...
- python 字符编码处理_浅析Python 字符编码与文件处理
Python字符编码 目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk. python2默认的字符编码方式是ASCII python3默认的字符编码方式是Un ...
- python pdf脚本之家_Python实现简单拆分PDF文件的方法
本文实例讲述了Python实现简单拆分PDF文件的方法.分享给大家供大家参考.具体如下: 依赖pyPdf处理PDF文件 切分pdf文件 使用方法: 1)将要切分的文件放在input_dir目录下 2) ...
- python解释器详解_浅析Python解释器的设计(一)
一些铺垫(扯淡) 历史上,在Python 2.4以及之前的版本,py代码的执行,也就是从源码到bytecode分为两步: 解析py源码成为分析树 (Parser/pgen.c)基于分析树优化缩减byt ...
- python 小括号 运算_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
- python中括号的作用_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
- python代替javascript_取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言
对于开发人员来说,哪些编程语言最受欢迎?哪些框架.包.函数和方法被提问的次数最多?哪种数据类型使用起来最痛苦?各个编程语言之间的问题有何不同?--本文中汇总了数百万个各个开发领域内的不同问题,挑选了1 ...
- python查看图片的gps_浅析python中获取图片中exif中的gps方法
现在很多手机都支援在照片中的exif中存储位置gps信息了,不过有时假如我们想在在线地图中定位照片中却犯了难,windows或acdsee显示的都是度分秒的方式,不能复制也不适宜得到到在线地图中定位, ...
- python继承问题_深入浅析python继承问题
有如下的代码: class p1: def __init__(self,a,b): print("init in p1") self.a1=a self.b1=b self.f1( ...
最新文章
- 经典C语言程序100例之四四
- wordpress插件-WP Rocket 3.10.1_去广告已授权
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性...
- LINUX线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量等
- 95-30-015-Channel-AbstractNioMessageChannel
- HALCON 20.11:深度学习笔记(11)---目标检测
- VM虚拟机Bridge模式VMnet0网卡无法启动问题的解决
- 【JAVA笔记——器】Spring MVC + HATEOAS RestFul快速搭建
- 让 Alfred 支持拼音
- ADS1115的IIC通信
- linux 效果器软件下载,盘点丨15款免费又好用的音乐制作软件
- 设置标题栏背景色,背景色是自定义背景色
- Hot and cold pages
- 管理员同志,回收站博文希望得到恢复,万分感谢
- 上层应用程序是如何访问到底层驱动程序的呢?
- 西门子PLC中DB与DI有什么区别
- Python 的文件路径和操作(一)
- linux或者UC/OS
- liunx安装node
- android 购物车实现,Android Studio实现简单购物车功能
热门文章
- apache php日志配置,HTML_初学:apache与php基本配置,1、APACHE的日志主要分为“ - phpStudy...
- 点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能
- 计算机主机的主要包括,微型计算机的主机主要包括
- c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...
- 群晖服务器性能测试,对群晖DS716+进行性能测试_群晖 DS716+_企业存储技术与评测-中关村在线...
- Java 判断目录是否为空
- linux代码_Sonar代码走查的配置(linux)
- 爬虫4-正则表达式及Python的re模块
- Python递归通用接口响应深层提取
- 【Python】time内置模块处理时间信息