python工厂模式_【Python篇】工厂模式

工厂方法模式

前言

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

工厂方法模式(Factory Method)

抽象工厂模式 (Abstract Factory)

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

工厂意图

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

别名

虚构造器(Virtual Constructor)

案例

第一阶段

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

第一阶段 UML 图

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

83ce437ce8df7956994e7bb6a64f4a30.svg#lake_card_v2=eyJjb2RlIjoiQHN0YXJ0dW1sXG5jbGFzcyDlt6XljoIge1xuXHQr55Sf5Lqn5bCP57Gz5omL5py6KCk65omL5py6IC4uPiDlsI_nsbPmiYvmnLpcblx0K-eUn-S6p-iLueaenOaJi-acuigpOuaJi-acuiAuLj4g6Iu55p6c5omL5py6XG59XG5DbGllbnQgLS0g5bel5Y6CXG7miYvmnLogLS0gIENsaWVudFxu5bCP57Gz5omL5py6IC0tPiDmiYvmnLpcbuiLueaenOaJi-acuiAtLT4g5omL5py6XG5AZW5kdW1sIiwidHlwZSI6InB1bWwiLCJtYXJnaW4iOnRydWUsImlkIjoiWU9xUXYiLCJ1cmwiOiJodHRwczovL2Nkbi5ubGFyay5jb20veXVxdWUvX19wdW1sLzgzY2U0MzdjZThkZjc5NTY5OTRlN2JiNmE2NGY0YTMwLnN2ZyIsImNhcmQiOiJkaWFncmFtIn0=

第一阶段代码

通过代码去实现这个逻辑

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

00489dd8e29e8d9e0406b38be34f5d7f.svg#lake_card_v2=eyJjb2RlIjoiQHN0YXJ0dW1sXG5hYnN0cmFjdCBjbGFzcyDmir3osaHlt6XljoIge1xuXHQr55Sf5Lqn5omL5py6KCk65omL5py6XG59XG5hYnN0cmFjdCBjbGFzcyDmiYvmnLoge1xufVxuXG5DbGllbnQgLS0g5oq96LGh5bel5Y6CXG7miYvmnLogLS0gIENsaWVudFxu5omL5py6IDx8LS0g5bCP57Gz5omL5py6IFxu5omL5py6IDx8LS0g6Iu55p6c5omL5py6XG5cbuiLueaenOW3peWOgiAuLj4g6Iu55p6c5omL5py6XG7oi7nmnpzlt6XljoIgOiDnlJ_kuqfmiYvmnLooKTrmiYvmnLpcblxu5bCP57Gz5bel5Y6CIC4uPiAg5bCP57Gz5omL5py6XG7lsI_nsbPlt6XljoIgOiDnlJ_kuqfmiYvmnLooKTrmiYvmnLpcblxu5oq96LGh5bel5Y6CIDx8LS0g6Iu55p6c5bel5Y6CXG7mir3osaHlt6XljoIgPHwtLSDlsI_nsbPlt6XljoIgXG5cbkBlbmR1bWwiLCJ0eXBlIjoicHVtbCIsIm1hcmdpbiI6dHJ1ZSwiaWQiOiJubnpObiIsInVybCI6Imh0dHBzOi8vY2RuLm5sYXJrLmNvbS95dXF1ZS9fX3B1bWwvMDA0ODlkZDhlMjllOGQ5ZTA0MDZiMzhiZTM0ZjVkN2Yuc3ZnIiwiaGVpZ2h0Ijo0ODAsImNhcmQiOiJkaWFncmFtIn0=

第二阶段代码

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

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

总结

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

简单工厂模式优缺点

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

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

工厂方法模式优缺点

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值