简单工厂模式和工厂方法模式

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

简单工厂模式

from abc import ABC, abstractmethod

# 生产线
class ProductLine(ABC):
    
    @abstractmethod
    def make(self):
        pass        

# 苹果生产线
class Apple(ProductLine):
    
    def make(self):
        print("make apple")

# 小米生产线
class XiaoMi(ProductLine):
    
    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()
------
#output:
make apple
make xiaomi

随着第一阶段的订单完成,现在越来越多的手机厂商来找小李来生产手机,问题来了,生产线改造需要导致整个工厂停工一段时间,每次停工对工厂来说都是巨大的损失。那么该怎么解决问题呢?一个工厂似乎不够用了,那么该怎么解决呢? 把所有的生产线独立出来到单独的工厂,这样子需要生产新的手机只需要新增新的工厂就好了,不会影响其他的手机的生产。

工厂方法模式

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 ProductLine(ABC):
       
    @abstractmethod
    def make(self):
        pass

# 苹果生产线
class Apple(ProductLine):
    
    def make(self):
        print("make apple")

# 小米生产线
class XiaoMi(ProductLine):
    
    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()
----
#output:
make apple
make xiaomi

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

---------------------------------------------------------------------------------------------------------------------------------------------

简单工厂模式优缺点

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

工厂方法模式优缺点

  • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
  • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类
posted @ 2020-08-06 10:58  ttoia  阅读(450)  评论(0编辑  收藏  举报