普通工厂模式
工厂模式(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