【Python篇】工厂模式
2024-09-08 02:15:52
工厂方法模式
前言
在《设计模式》一书中工厂模式提到了:
- 工厂方法模式(Factory Method)
- 抽象工厂模式 (Abstract Factory)
但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。
工厂意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
别名
虚构造器(Virtual Constructor)
案例
第一阶段
小李开了一个代工厂,专门帮各大厂商生产手机,一开始只有小米找他生产小米手机(MiPhone),后来质量过硬,声名远播,苹果公司也找上门了,准备让他生产苹果手机,生意来了,小李小手一挥,停工几个月,加了一个生产线专门生成苹果手机(Iphone)。于是乎,现在一个工厂有两个生产线。
第一阶段 UML 图
让我们借助 UML 图直观了解一下工厂现在的样子。
第一阶段代码
通过代码去实现这个逻辑
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 图了解一下这个阶段工厂的样子吧。
第二阶段代码
同样让我们借助代码去实现这一阶段的逻辑
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
总结
上面的案例中的俩个阶段分别对应了两个设计模式,分别是:**简单工厂模式 **和 工厂方法模式。通过案例和对比,我们不难发现它们的的优缺点。
简单工厂模式优缺点
- 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
- 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则
工厂方法模式优缺点
- 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
- 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类
最新文章
- 深入理解脚本化CSS系列第五篇——动态样式
- [网络安全] [视频分享]KaLi Linux基础培训2016 最新的哦【福吧资源网】
- 在object,embed上添加跳转链接(视频上添加跳转)
- TCP、UDP、IP 协议分析
- ios7 tableview被navigationbar挡住
- C# 参数化SQL语句中的like和in
- oracle 查看运行中sql
- [转]揭秘webdriver实现原理
- 网页上记录鼠标的点击次数和一段有用的php代码,自己学习使用
- 第二百四十天 how can I 坚持
- phonegap退出android程序
- IController控制器的创建过程
- 201521123099 《Java程序设计》第13周学习总结
- JQuery基本过滤器
- dubbo源码分析8——服务暴露概述
- 关于 SAXParseException Content is not allowed in Prolog (前言中不允许有内容)
- The way to Go(3): 安装Go环境
- python pip安装模块提示错误failed to create process
- 83、android的消息处理机制(图+源码分析)——Looper,Handler,Message
- try语句块和异常处理
热门文章
- grafana repeat 特性
- Python语言基础-语法特点、保留字与标识符、变量、基本数据类型、运算符、基本输入输出、Python2.X与Python3.X区别
- Java 设置PDF平铺图片背景(水印)
- Java8新特性之函数式接口
- ca76a_c++_流文件打开输入输出文件模式p773
- ASP.NET处理管道之防盗链
- Area.js下载
- laravel Excel 导入
- VMware 15安装Ubuntu 16.04并配置环境
- Redis 的基本数据类型 和 基础应用场景