Python Factory 工厂方法

工厂的意义

模拟现实工厂,通过“工厂”获取“产品”,用户只需通过固定的接口获得一个对象的实例。降低了维护的复杂性。

下面我将对无工厂方式,简单工厂方式,工厂方式,抽象工厂方式进行对比与分析。

无工厂

代码祭天:

#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

当产品增多业务复杂时,例如工厂不仅生产手机还要生产电脑时面对这种业务场景,就需要使用抽象工厂方法

优缺点
缺点复杂度提升,代码的可读性降低
优点适用于复杂的业务场景

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值