此系列是对《阿里巴巴技术协会-Python与设计模式系列课程》学习笔记。
一、快餐点餐系统
麦当劳的自助点餐系统一般是这样的:在一个大的触摸屏上,有三类可选择的餐品:汉堡等主食、小吃、饮料。当我们选择好自己的食物,支付完成后订单就生成了。下面我们用“工厂模式”来生成这些食物的逻辑主题。
主食汉堡类
#汉堡
class Burger():
name = ""
price = 0.0
def getPrice(self):
return self.price
def setPrice(self,price):
self.price = price
def getName(self):
return self.name
#两个汉堡子类
class cheeseBuger(Burger):
def __init__(self):
self.name = "cheese burger"
self.price = 10.0
class spicychickenBuger(Burger):
def __init__(self):
self.name = "spicy chicken burger"
self.price = 15.0
小吃类
#小吃
class Snack():
name = ""
price = 0.0
def getPrice(self):
return self.price
def setPrice(self,price):
self.price = price
def getName(self):
return self.name
#两种小吃
class chips(Snack):
def __init__(self):
self.name = "chips"
self.price = 6.0
class chickenWings(Snack):
def __init__(self):
self.name = "chicken wings"
self.price = 9.0
饮料类
#饮料
class Beverage():
name = ""
price = ""
def getPrice(self):
return self.price
def setPrice(self,price):
self.price = price
def getName(self):
return self.name
class coke(Beverage):
def __init__(self):
self.name = "coke"
self.price = 3.5
class milk(Beverage):
def __init__(self):
self.name = "milk"
self.price = 5.5
以上的Burger、Snack、Beverage都可认为是该快餐店的产品,由于只提供了抽象方法,我们把他们叫做抽象产品类,而cheese Burger等6个由抽象产品类衍化生出的子类,叫做具体产品类。
工厂类
#工厂
class foodFactory():
type = ""
def createFood(self,foodClass):
print(self.type,"factory produce a instance.")
foodIns = foodClass()
return foodIns
class burgerFactory(foodFactory):
def __init__(self):
self.type = "BURGER"
class snackFactory(foodFactory):
def __init__(self):
self.type = "SNACK"
class beverageFactory(foodFactory):
def __init__(self):
self.type = "BEVERAGE"
同样,foodFactory为抽象的工厂类,burgerFactory、snackFactory、beverageFactory为具体的工长类。
在业务场景中,工厂模式如何“生产”产品呢?
if __name__ == '__main__':
#实例化具体工厂
burger_factory = burgerFactory()
snack_factory = snackFactory()
beverage_factory = beverageFactory()
#工厂根据传入的参数直接生产对应的产品
cheese_burger = burger_factory.createFood(cheeseBuger)
print(cheese_burger.getName(),cheese_burger.getPrice())
chicken_wings = snack_factory.createFood(chickenWings)
print(chicken_wings.getName(),chicken_wings.getPrice())
coke_drink = beverage_factory.createFood(coke)
print(coke_drink.getName(),coke_drink.getPrice())
可见,业务中先生成了具体的工厂,然后调用工程中的createFood()方法和对应对应的参数直接生成产品实例,而后即可以调用产品实例的方法或者属性。
工厂模式:定义一个用户与创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。产品类定义产品的公共属性和接口,工厂类定义产品实例化的“方式”。(其实看不太懂这段在说什么 ?)
工厂模式的优缺点和应用
优点:
缺点:①具有非常好的封装性,代码结构清晰
②屏蔽产品类,使产品的被使用业务场景和产品的功能细节可以分而开发进行,是比较典型的解耦框架
应用场景:①工厂模式相对于直接生成实例过程要复杂一些,所以在小项目中,可以不使用
②抽象工厂模式中,产品类的扩展比较麻烦,毕竟,每一个工厂对应一类产品,产品扩展,意味着抽象工厂也要扩展
当系统实例要求你交灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式。比如,在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么久可以对应建立对应层级的抽象工程,根据不同的“产品需求”去生产定制的实例
半知半解~ ? ? ?