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

总结

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

简单工厂模式优缺点

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

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

工厂方法模式优缺点

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LaTeX 的对参考文献的处理

LaTeX 的对参考文献的处理实在是非常的方便,我用过几次,有些体会,写出来供大家 参考。当然,自己的功力还不够深,有些地方问题一解决就罢手了,没有细究。LaTeX 对参考文献的处理有这么一些优点:1…

android 拦截外拨电话,Android拦截外拨电话程序示例

拦截监听外拨的电话,并进行处理:向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给拔号广播接收者的电话号码&#…

linux下达梦数据库启动_linux上安装tomcat和达梦数据库

环境:系统:红帽linux企业版4(红旗LINUX也是一样,会更简单)jakarta-tomcat-5.0.28.tar.gz(二进制源码)jdk-1_5_0_15-linux-i586-rpm.bin(RPM包)达梦数据库目的:大部分政分机关,大型企事业单位都用LINUX作为服务器&#…

传感器系列之4.3流量传感器

4.3 流量数据采集实验 一、实验目的掌握水流量计的结构与工作原理掌握霍尔传感器的使用二、实验材料具有USB 串口通讯的PC 机1 台ADS1.2 集成开发软件1 套J-Link-ARM 仿真器及软件1 套NXP LPC2378 实验节点板1 个LCD 显示实验板1 个BMP085数字气压传感器模块1个三、实验原理流量…

鸿蒙日程管理若离,2020华为HDC日程确定,鸿蒙、HMS以及EMUI 11成最关注点

HDC:华为开发者大会,目前已经确定将在9月10日正式开幕。日前华为已经在其官网公布了HDC的日程,从现在的消息看华为开发者大会有三大点最受业内关注。鸿蒙操作系统鸿蒙操作系统应该是大家关注最大的话题,不过此前余承东已经正式表示…

python打印二进制内容_在python中打印出c类型的二进制表示

您可以使用切片(或str.rstrip),int和format的组合.>>> inp 0x0202020202UL>>> format(int(inp[:-2], 16), b)1000000010000000100000001000000010# Using str.rstrip, This will work for any hex, not just UL>>> format(int(inp.rstrip(UL), 16)…

vi - a linux command

创建一个文件的linux命令,参考格式如下—— vi hello.txt 保存或退出命令的操作——按ESC键 跳到命令模式,然后::w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件…

语言课设医院诊疗系统_江苏孤独症孩子有哪些典型特征?上海六一儿童医院

孤独症孩子有哪些典型特征当家长发现孩子不爱说话,不理人的时候,有时怀疑孩子是不是患了孤独症。对于孤独症的孩子和正常的孩子还是不一样的。那么,孤独症孩子有哪些典型的特征呢?孤独症孩子的典型特征主要有以下几点:特征一&…

不一样 使用别名 数据字段和bean_Mybatis-resultMap标签详解

是Maybatis的结果集封装,搭配等标签的resultMap属性使用属性:id:该封装规则的唯一标识type:封装出来的类型,可以是jdk自带的,比如Map,应该可以是自定义的,比如EmployeeautoMapping:自动封装,如果…

android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点

原标题:提升用户体验 可升Android 6.0机型盘点【手机中国 导购】2009年Android系统正式发布,由此加速手机走向智能化进度。如今,随着Android系统日渐成熟,众多手机厂商都在此基础上研发出符合自家特色的系统版本,并且流…

MariaDB exists 学习

MariaDB exists 学习 exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如…

antd 能自适应吗_一种能自适应识别母线运行方式的备自投装置应用探讨

中山供电局的研究人员江清楷,在2019年第8期《电气技术》杂志上撰文,介绍了一种220kV备自投装置,列出了母联备自投和线路备自投的充电条件及起动条件。以220kV逸仙变电站为例,指出该备自投装置在双母线单分段接线的变电站应用中存在…

python抓取html中特定的数据库,Python抓取网页中内容,正则分析后存入mysql数据库...

firefoxhttpfox可以查看post表单首先在http://www.renren.com/这个地址输入用户名和密码,输入用户名和密码之后post到下面这个网址:http://www.renren.com/PLogin.do#renren.pyimport urllibimport urllib2import cookielibcookie cookielib.CookieJar(…

第二次团队冲刺--9

昨天:数据库的输出。今天:数据库的输出。遇到的问题:数据库里数据的输出问题。转载于:https://www.cnblogs.com/chenpengmeng/p/5559542.html

html页面tableview,用JS写的一个TableView控件代码

请看看编码是否规范,使用是否方便HTML:代码编号姓名{value}{value}编号名称{value}{value}Javascript:代码//class TableView {//构造函数function TableView(ID){var htmlTable document.getElementById(ID);this.container htmlTable.getElementsByTagName(&quo…

a4988 脉宽要求_A4982/A4984/A4985和A4988设备主要针对办公室自动化市场

随着社会的发展,在工作中,办公室的自动化需求加大,这就需要有各种办公室自动化设备的支持。Allegro MicroSystems公司宣布扩展其微步电动机驱动器系列,该系列共包含可减少外置元件和利用简单STEP(步进)和Direction(方向)接口的四款…

HTML中空格代码为,html空格 html 空格代码

html 空格和html空格代码篇在HTML网页排版机关时,一个翰墨与翰墨间空格可使用一个使用空格键直接空一格便可。然则要实现多个空格间隔,打再多空格键空格,始终至多展现一个空格地位。那末如何才智html构造中笔墨间完成多个空格成果&#xff1f…

centos 下载文件很慢_CentOS镜像下载

官网下载链接:http://isoredirect.centos.org/centos/7/isos/x86_64/step1: 进入下载页,选择阿里云站点进行下载Actual Country 国内资源 Nearby Countries 周边国家资源阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/每个链接…

使用java实现持续移动的小球

原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5559829.html 仅为自己学习作品,使用java的JFrame框架实现持续移动的小球。 最核心的部分为实现小球移动的move()方法,在小球碰到墙壁四壁的时候得以反弹&…

移动端html搜索怎么写,移动端实现搜索功能

在移动端需要实现如下搜索相关的功能点击搜索按钮实现搜索搜索按钮这里首先就会遇到怎么弹出搜索按钮。在html5 中 input 已经支持search 类型,iso/安卓所幸也都有自己的相应实现。只需要按照移动端的标准来写,那我就会为我们提供我们所需的搜索按钮。按…