zoukankan      html  css  js  c++  java
  • 【Python篇】工厂模式

    工厂方法模式

    前言


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

    • 工厂方法模式(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
    

    总结

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

    简单工厂模式优缺点

    • 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
    • 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

    工厂方法模式优缺点

    • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
    • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类
  • 相关阅读:
    推荐!国外程序员整理的 PHP 资源大全
    PHPSTORM/IntelliJ IDEA 常用 设置配置优化
    PHPStorm下XDebug配置
    MySQL修改root密码的多种方法
    php 修改上传文件大小 (max_execution_time post_max_size)
    phpstorm8注册码
    Linux提示no crontab for root的解决办法
    网站的通用注册原型设计
    解决mysql出现“the table is full”的问题
    通过php下载文件并重命名
  • 原文地址:https://www.cnblogs.com/leetao94/p/13277517.html
Copyright © 2011-2022 走看看