工厂的意义
模拟现实工厂,通过“工厂”获取“产品”,用户只需通过固定的接口获得一个对象的实例。降低了维护的复杂性。
下面我将对无工厂方式,简单工厂方式,工厂方式,抽象工厂方式进行对比与分析。
无工厂
代码祭天:
#encoding=utf-8
class IPhone(object):
#苹果
def __repr__(self):
return "IPhone"
class Huawei(object):
# 华为
def __repr__(self):
return "Huawei"
#encoding=utf-8
class IMAC(object):
#苹果
def __repr__(self):
return "IMAC"
class HuaweiMAC(object):
# 华为
def __repr__(self):
return "HuaweiMAC"
if __name__ == '__main__':
print IPhone()
print Huawei()
print IMAC()
print HuaweiMAC
假设我么有四个产品分别是:
(苹果手机,IPhone),(苹果电脑,IMAC),(华为手机,Huawei),(华为电脑,HuaweiMAC)四个类
在主函数中实例化四个类对象
运行主函数结果:
IPhone
IMAC
Huawei
HuaweiMAC
缺点 | 但现实中,你可能会面对很多产品,而且每个产品的构造参数还不一样,这样在创建实例时会遇到麻烦。 |
优点 | 简单易懂,初学者适用 |
简单工厂
代码祭天:
from noFactory import IPhone, Huawei
class SimplePhoneFactory(object):
@staticmethod
def get_phone(name):
if name == 'iphone':
return IPhone()
elif name == 'huawei':
return Huawei()
if __name__ == '__main__':
print SimplePhoneFactory.get_phone('iphone')
print SimplePhoneFactory.get_phone('huawei')
运行主函数结果:
IPhone
Huawei
构造一个“简单工厂”把所有实例化的过程封装在里面。需要什么直接调工厂里的方法。
缺点 | 但在实际使用工厂的过程中,我们会发现新问题:如果我们要新增一个“产品”就需要修改getphone()方法违背了软件设计中的开闭原则即在扩展新的类时,尽量不要修改原有代码。 |
优点 | 简单易懂,适用于需创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂的情况下,而且用户只关心哪种类型的实例被创建, |
工厂方法
代码祭天:
# coding=utf-8
import abc
# 工厂方法
from noFactory import IPhone, Huawei
class AbstractFactory(object):
# 抽象的工厂类
__metaclass__ = abc.ABCMeta
# python不同于java没有abstract抽象类关键字通过加载abc实现抽象方法
@abc.abstractmethod
def get_phone(self):
pass
# 苹果工厂
class IPhoneFactory(AbstractFactory):
def get_phone(self):
return IPhone()
# 华为工厂
class HuaweiFactory(AbstractFactory):
def get_phone(self):
return Huawei()
if __name__ == '__main__':
iphone = IPhoneFactory().get_phone()
huawei = HuaweiFactory().get_phone()
print iphone
print huawei
运行主函数结果:
IPhone
Huawei
我们在简单工厂的基础上抽象成不同的工厂,每个工厂对应生成自己的产品,这就是工厂方法。
缺点 | 复杂度提升,代码的可读性降低,仍不能完全解决复杂场景 |
优点 | 耦合性降低,每个工厂负责生产自己的产品也避免了我们在新增产品时需要修改工厂的代码,而只要增加相应的工厂即可 |
抽象工厂方法
代码祭天:
# coding=utf-8
import abc
# 工厂方法
from noFactory import IPhone, Huawei, IMAC, HuaweiMAC
class AbstractFactory(object):
# 抽象的工厂类
__metaclass__ = abc.ABCMeta
# python不同于java没有abstract抽象类关键字通过加载abc实现抽象方法
@abc.abstractmethod
def get_phone(self):
pass
@abc.abstractmethod
def get_computer(self):
pass
# 苹果工厂
class IPhoneFactory(AbstractFactory):
def get_phone(self):
return IPhone()
def get_computer(self):
return IMAC()
# 华为工厂·
class HuaweiFactory(AbstractFactory):
def get_phone(self):
return Huawei()
def get_computer(self):
return HuaweiMAC()
if __name__ == '__main__':
print IPhoneFactory().get_phone()
print IPhoneFactory().get_computer()
print HuaweiFactory().get_phone()
print HuaweiFactory().get_computer()
运行主函数结果:
IPhone
IMAC
Huawei
HuaweiMAC
当产品增多业务复杂时,例如工厂不仅生产手机还要生产电脑时面对这种业务场景,就需要使用抽象工厂方法
缺点 | 复杂度提升,代码的可读性降低 |
优点 | 适用于复杂的业务场景 |
来源:https://blog.csdn.net/u011654843/article/details/99692401