02、设计模式Python版-普通工厂模式

普通工厂模式

工厂模式(Factory Pattern)是非常常用的一种模式,主要分为2大部分:

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

两者同属普通工厂模式,只是在理念上有一些细微的差异。

该模式属于创建型模式。

简单工厂模式

基本介绍

用户只需关注自身需要一个什么样的产品,而不用将注意力放在如何构建这个产品上。

只要用户构思好了,直接从工厂类的一个指定接口中去拿产品即可。、

特点:对外隐藏,只暴露一个接口,但这个接口可以创建出非常多的用户所需要的产品

案例图示

假如一个用户要买手机,他只需要考虑手机的品牌,型号,颜色等信息,而并不需要关心去那里买的问题,因为在手机城里各式各样的手机都应有尽有。

 

优缺点

优点:

  • 隐藏对象创建的细节
  • 客户端不需要修改代码

缺点:

  • 违反单一职责原则,将创建逻辑集中到了一个工厂类里
  • 当添加新的产品时,需要修改工厂类的代码,违反了开闭原则

代码实现

用Python实现简单工厂模式:

# 定义手机厂商
class BasePhone:
    def __init__(self, model, color) -> None:
        self.model = model
        self.color = color

    def getInfo(self):
        return "A %s mobile phone, the brand is %s, the model is %s" % (self.color, self.brand, self.model)
class SamSung(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
class Apple(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
class HuaWei(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
# 定义工厂
class MobleCity:
    def shopPhone(self, brand, model, color):
        brandDict = {
            "SamSung": SamSung,
            "Apple": Apple,
            "HuaWei": HuaWei
        }
        cls = brandDict.get(brand)
        if cls:
            instance = cls(model, color)
            return instance
        raise TypeError("no brand : %s" % brand)
if __name__ == "__main__":
    store = MobleCity()
    iphone_x = store.shopPhone(brand="Apple", model="X", color="black")
    sumsung_note7 = store.shopPhone(
        brand="SamSung", model="Note 7", color="blue")
    huawei_p10 = store.shopPhone(brand="HuaWei", model="P10", color="white")
    print(iphone_x.getInfo())
    print(sumsung_note7.getInfo())
    print(huawei_p10.getInfo())

# A black mobile phone, the brand is Apple, the model is X
# A blue mobile phone, the brand is SamSung, the model is Note 7
# A white mobile phone, the brand is HuaWei, the model is P10

工厂方法模式

基本介绍

简单工厂模式是将所有产品都放在1个工厂中,而工厂方法模式是每个不同种类的产品都放在一个单独的工厂中。

相较于简单工厂模式来说,设计更加简单一些。

特点:对外隐藏,每个工厂指定暴露一个接口,用于让用户取出该工厂的产品

案例图示

假如一个用户要买手机,他只需要考虑手机的品牌,型号,颜色等信息,并不需要关心手机是怎么造出来的,充分对外隐藏内部实现细节。

只要用户构思好了,就直接到每个手机品牌专卖店去买即可:

 

乍一看和简单工厂很相似,但是这个是每个手机品牌都有一个自己的专卖店,也就是说代码耦合度降低了。

优缺点

优点:

  • 每个具体产品都对应一个具体的工厂类,当新增产品时不需要修改工厂类代码
  • 隐藏了对象创建的细节

缺点:

  • 每增加一个具体产品类,就必须增加一个相应的具体工厂类

代码实现

用Python实现工厂方法模式:

# 定义手机厂商
class BasePhone:
    def __init__(self, model, color) -> None:
        self.model = model
        self.color = color

    def getInfo(self):
        return "A %s mobile phone, the brand is %s, the model is %s" % (self.color, self.brand, self.model)
class SamSung(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
class Apple(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
class HuaWei(BasePhone):
    def __init__(self, model, color) -> None:
        self.brand = __class__.__name__
        super(__class__, self).__init__(model, color)
# 定义工厂
class SamSungStore:
    def shopPhone(self, model, color):
        return SamSung(model, color)
class AppleStore:
    def shopPhone(self, model, color):
        return Apple(model, color)
class HuaWeiStore:
    def shopPhone(self, model, color):
        return HuaWei(model, color)
if __name__ == "__main__":
    samsungStore = SamSungStore()
    appleStore = AppleStore()
    huaweiStore = HuaWeiStore()
    iphone_x = appleStore.shopPhone(model="X", color="black")
    sumsung_note7 = samsungStore.shopPhone(model="Note 7", color="blue")
    huawei_p10 = huaweiStore.shopPhone(model="P10", color="white")
    print(iphone_x.getInfo())
    print(sumsung_note7.getInfo())
    print(huawei_p10.getInfo())

# A black mobile phone, the brand is Apple, the model is X
# A blue mobile phone, the brand is SamSung, the model is Note 7
# A white mobile phone, the brand is HuaWei, the model is P10