浅析Python 简单工厂模式和工厂方法模式的优缺点

作者:Leetao 时间:2023-08-04 00:15:00 

前言

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

  • 工厂方法模式(Factory Method)

  • 抽象工厂模式 (Abstract Factory)

但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。

工厂意图

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

别名

虚构造器(Virtual Constructor)

案例

第一阶段

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

第一阶段 UML 图

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

浅析Python 简单工厂模式和工厂方法模式的优缺点

第一阶段代码

通过代码去实现这个逻辑


from abc import 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 图了解一下这个阶段工厂的样子吧。

浅析Python 简单工厂模式和工厂方法模式的优缺点

第二阶段代码

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


from abc import 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

总结

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

简单工厂模式优缺点

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

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

工厂方法模式优缺点

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

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

来源:https://www.cnblogs.com/leetao94/p/13277517.html

标签:Python,简单,工厂,方法,模式
0
投稿

猜你喜欢

  • JavaScript来实现打开链接页面的简单实例

    2024-04-30 09:51:32
  • 将ASP记录集输出成n列的表格形式显示的方法

    2011-04-08 10:51:00
  • python中列表对象pop()方法的使用说明

    2021-10-25 09:45:40
  • Python代码使用 Pyftpdlib实现FTP服务器功能

    2022-02-11 16:40:55
  • Python获取网络图片和视频的示例代码

    2023-06-24 08:37:58
  • JS实现仿新浪微博发布内容为空时提示功能代码

    2023-08-22 21:52:13
  • 使用python实现画AR模型时序图

    2021-07-03 01:11:08
  • vue表单数据交互提交演示教程

    2024-04-10 13:48:08
  • 三行代码使用Python将视频转Gif的方法示例

    2021-02-28 13:53:39
  • 利用Python实现读取Word文档里的Excel附件

    2022-01-21 11:28:18
  • 在pycharm中使用git版本管理以及同步github的方法

    2021-12-08 01:59:58
  • python3.x 生成3维随机数组实例

    2021-04-11 04:02:43
  • MySQL里的反斜杠(\\\\)的使用

    2024-01-26 03:20:57
  • JavaScript数组及非数组对象的深浅克隆详解原理

    2024-04-19 09:52:51
  • python实现滑雪游戏

    2021-10-08 05:20:35
  • pycharm 使用心得(三)Hello world!

    2022-10-08 09:59:56
  • Python实现一个自助取数查询工具

    2023-03-03 03:46:16
  • python利用opencv调用摄像头实现目标检测

    2023-01-07 10:16:18
  • Dreamweaver给你的网页盖个章

    2008-02-03 11:35:00
  • Python使用Web框架Flask开发项目

    2021-07-08 20:08:56
  • asp之家 网络编程 m.aspxhome.com