设计模式之工厂类相关模式

引入点:快餐点餐系统

在一个大的触摸显示屏上,有三类可以选择的上餐品:汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后,订单就生成了。下面,我们用今天的主角--工厂模式--来生成这些食物的逻辑主体。

主餐的生成(仅以两种汉堡为例)。

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为抽象的工厂类,而burgerFactorysnackFactorybeverageFactory为具体的工厂类。
在业务场景中,

生产产品

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、抽象工厂模式中,产品类的扩展比较麻烦。毕竟,每一个工厂对应每一类产品,产品扩展,就意味着相应的抽象工厂也要扩展

应用场景:

  当系统实例要求比较灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式实现。比如,在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么就可以对应建立对应层级的抽象工厂,根据不同的“产品需求”去生产定制的实例。

原文地址:https://www.cnblogs.com/Lance-WJ/p/13572745.html