写点什么

工厂方法模式

用户头像
Leetao
关注
发布于: 2020 年 07 月 10 日

前言


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

  • 工厂方法模式(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 applemake 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 xiaomimake apple
复制代码


总结

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


简单工厂模式优缺点

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

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

工厂方法模式优缺点

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

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

发布于: 2020 年 07 月 10 日阅读数: 67
用户头像

Leetao

关注

一个喜欢瞎折腾的程序员 2018.11.09 加入

微信公众号:【桃子的学习笔记】 个人网站:https://www.leetao94.cn

评论

发布
暂无评论
工厂方法模式