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


    引入点:快餐点餐系统

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

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

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

    应用场景:

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

  • 相关阅读:
    Python 爬取网易云歌手的50首热门作品
    对于AES和RSA的个人理解
    sqlzoo
    项目部署 uwsgi+nginx+crm
    nginx学习
    redis补充知识--- 缓存击穿、缓存雪崩、缓存穿透
    redis-cluster 搭建
    redis主从复制
    redis-sentinel (哨兵)
    redis 发布订阅
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/13572745.html
Copyright © 2020-2023  润新知