引入点:快餐点餐系统
在一个大的触摸显示屏上,有三类可以选择的上餐品:汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后,订单就生成了。下面,我们用今天的主角--工厂模式--来生成这些食物的逻辑主体。
主餐的生成(仅以两种汉堡为例)。
class Burger:
name = ""
price =0.0
def getPrice(self):
return self.price
def setPirce(self,price)
self.price = price
def getName(self):
return self.name
class SpicyChickenBurger(Burger):
def __init__(self):
self.name="spicy chicken burger"
self.price=15.0
class CodFishBurger(Burger):
def __init__(self):
self.name="cod fish burger"
self.price=20.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 PopcornChicken(Snack):
def __init__(self):
self.name = "popcorn chicken"
self.price = 12.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 Coke(Snack):
def __init__(self):
self.name = "coke"
self.price = 6.0
class Coffee(Snack):
def __init__(self):
self.name = "Coffee"
self.price = 12.0
以上的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_factorry=snackFactory()
beverage_factory=beverageFactory()
cheese_burger=burger_factory.createFood(CodFishBurger)
print(cheese_burger.getName(),cheese_burger.getPrice())
chicken_wings=snack_factorry.createFood(PopcornChicken)
print(chicken_wings.getName(),chicken_wings.getPrice())
coke_drink=beverage_factory.createFood(coke)
print(coke_drink.getName(),coke_drink.getPrice())
先产生工厂,再通过工厂中的
creatFood
方法和相关参数制造出商品BURGER factory produce a instance.
cod fish burger 20.0
SNACK factory produce a instance.
popcorn chicken 12.0
BEVERAGE factory produce a instance.
coke 6.0
工厂模式、简单工厂模式、抽象工厂模式
三种模式
工厂模式
工厂模式的定义如下:其产品类定义产品的公共属性和接口,工厂类定义产品实例化的“方式”。
通俗理解:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式
简单工厂模式:省去了将工厂实例化的过程
class simpleFoodFactory:
@classmethod
def createFood(cls,foodClass):
print("Simple factory produce a instance.")
foodIns = foodClass()
return foodIns
抽象工厂模式
抽象工厂模式:取消传入foodClass
直接将单个产品直接建立成工厂,比如讲不将薯条归到小吃工厂而吧薯条直接制造成薯条工厂,这样,生成食物时,foodClass
也不必指定。事实上,我们在写的过程当中还穿插了snackFactory
,它也就是具体食物工厂的一层抽象,通过这一层抽象工厂可以实例化出相同种类下的所有商品。这种模式,就是抽象工厂模式。
优缺点及应用
优点:
1、工厂模式巨有非常好的封装性,代码结构清晰;在抽象工厂模式中,其结构还可以随着需要进行更深或者更浅的抽象层级调整,非常灵活;
2、屏蔽产品类,使产品的被使用业务场景和产品的功能细节可以分而开发进行,是比较典型的解耦框架。
缺点:
1、工厂模式相对于直接生成实例过程要复杂一些,所以,在小项目中,可以不使用工厂模式;
2、抽象工厂模式中,产品类的扩展比较麻烦。毕竟,每一个工厂对应每一类产品,产品扩展,就意味着相应的抽象工厂也要扩展
应用场景:
当系统实例要求比较灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式实现。比如,在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么就可以对应建立对应层级的抽象工厂,根据不同的“产品需求”去生产定制的实例。