zoukankan      html  css  js  c++  java
  • python风格的抽象工厂模式

    抽象工厂模式:

    提供一个接口,用户创建多个相关或依赖对象,而不需要指定具体类。

    原则:

    依赖抽象,不依赖具体类。

    实例:

    用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(Dough、Sauce、Cheese和Clam)的抽象类型(PizzaIngredientFactory),这个类型的子类(NYPizzaIngredientFactory和ChicagoPizzaIngredientFactory)定义了产品被产生的方法。

    工厂模式和抽象工厂模式的区别:

    工厂模式是在派生类中定义一个工厂的抽象接口,然后基类负责创建具体对象;抽象工厂模式是维护一个产品家族,由基类定义产品被生产的方法,客户根据派生类的接口进行开发。

    代码:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    '''
    披萨
    '''
    class Pizza:
        name = ""
        dough = None
        sauce = None
        cheese = None
        clam = None
    
        def prepare(self):
            pass
    
        def bake(self):
            print "烘烤25分钟在350。".decode('utf-8')
    
        def cut(self):
            print "切割成对角线切片。".decode('utf-8')
    
        def box(self):
            print "放在官方的盒子中。".decode('utf-8')
    
        def get_name(self):
            return self.name
    
        def set_name(self, name):
            self.name = name
    
        def to_string(self):
            string = "%s:
    " % self.name 
            string += "    面团: %s
    " % self.dough.to_string() if self.dough else ""
            string += "    酱汁: %s
    " % self.sauce.to_string() if self.sauce else ""
            string += "    奶酪: %s
    " % self.cheese.to_string() if self.cheese else ""
            string += "    文蛤: %s
    " % self.clam.to_string() if self.clam else ""
            return string
    
    '''
    什么类别的披萨
    '''
    class CheesePizza(Pizza):
        def __init__(self, ingredient_factory):
            self.ingredient_factory = ingredient_factory
    
        def prepare(self):
            print "准备: %s" % self.name
            self.dough = self.ingredient_factory.create_dough()
            self.sauce = self.ingredient_factory.create_sauce()
            self.cheese = self.ingredient_factory.create_cheese()
    
    
    class ClamPizza(Pizza):
        def __init__(self, ingredient_factory):
            self.ingredient_factory = ingredient_factory
    
        def prepare(self):
            print "准备: %s" % self.name
            self.dough = self.ingredient_factory.create_dough()
            self.sauce = self.ingredient_factory.create_sauce()
            self.clam = self.ingredient_factory.create_clam()
    
    '''
    披萨店
    '''
    class PizzaStore:
        def order_pizza(self, pizza_type):
            self.pizza = self.create_pizza(pizza_type)
            self.pizza.prepare()
            self.pizza.bake()
            self.pizza.cut()
            self.pizza.box()
            return self.pizza
    
        def create_pizza(self, pizza_type):
            pass
    
    '''
    纽约披萨实体店1
    '''
    class NYPizzaStore(PizzaStore):
        def create_pizza(self, pizza_type):
            ingredient_factory = NYPizzaIngredientFactory()
    
            if pizza_type == "cheese":
                pizza = CheesePizza(ingredient_factory)
                pizza.set_name("纽约风格芝士披萨".decode('utf-8'))
            elif pizza_type == "clam":
                pizza = ClamPizza(ingredient_factory)
                pizza.set_name("纽约风格文蛤披萨".decode('utf-8'))
            else:
                pizza = None
    
            return pizza
    
    '''
    芝加哥披萨实体店2
    '''
    class ChicagoPizzaStore(PizzaStore):
         def create_pizza(self, pizza_type):
            ingredient_factory = ChicagoPizzaIngredientFactory()
    
            if pizza_type == "cheese":
                pizza = CheesePizza(ingredient_factory)
                pizza.set_name("芝加哥风格芝士披萨".decode('utf-8'))
            elif pizza_type == "clam":
                pizza = ClamPizza(ingredient_factory)
                pizza.set_name("芝加哥风格文蛤披萨".decode('utf-8'))
            else:
                pizza = None
    
            return pizza
    
    '''
    生产披萨的工厂
    '''
    class PizzaIngredientFactory:
        def create_dough(self):
            pass
    
        def create_sauce(self):
            pass
    
        def create_cheese(self):
            pass
    
        def create_clam(self):
            pass
    
    '''
    生产披萨的实体工厂1
    '''
    class NYPizzaIngredientFactory(PizzaIngredientFactory):
        def create_dough(self):
            return ThinDough()
    
        def create_sauce(self):
            return MarinaraSauce()
    
        def create_cheese(self):
            return FreshCheese()
    
        def create_clam(self):
            return FreshClam()
    
    '''
    生产披萨的实体工厂2
    '''
    class ChicagoPizzaIngredientFactory(PizzaIngredientFactory):
        def create_dough(self):
            return ThickDough()
    
        def create_sauce(self):
            return MushroomSauce()
    
        def create_cheese(self):
            return BlueCheese()
    
        def create_clam(self):
            return FrozenClam()
    
    
    class Dough:
        def to_string(self):
            pass
    
    class ThinDough(Dough):
        def to_string(self):
            return "薄的面团"
    
    class ThickDough(Dough):
        def to_string(self):
            return "厚的生面团"
    
    class Sauce:
        def to_string(self):
            pass
    
    class MarinaraSauce(Sauce):
        def to_string(self):
            return "番茄酱"
    
    class MushroomSauce(Sauce):
        def to_string(self):
            return "蘑菇酱"
    
    class Cheese:
        def to_string(self):
            pass
    
    class FreshCheese(Cheese):
        def to_string(self):
            return "新鲜的奶酪"
    
    class BlueCheese(Cheese):
        def to_string(self):
            return "蓝纹奶酪"
    
    class Clam:
        def to_string(self):
            pass
    
    class FreshClam(Clam):
        def to_string(self):
            return "新鲜的文蛤"
    
    class FrozenClam(Clam):
        def to_string(self):
            return "冷冻的文蛤"
    
    if __name__ == "__main__":
    	# 创建了两个披萨实体店
        ny_store = NYPizzaStore()
        chicago_store = ChicagoPizzaStore()
    
        # 在第一个披萨对象中订购了一个cheese风味的披萨
        pizza = ny_store.order_pizza("cheese")
        print pizza.to_string()
        print "迈克订购了一个 %s" % pizza.get_name()
        print 
    
        pizza = chicago_store.order_pizza("clam")
        print pizza.to_string()
        print "约翰订购了一个%s" % pizza.get_name()
        print
    

    结果:

    准备: 纽约风格芝士披萨
    烘烤25分钟在350。
    切割成对角线切片。
    放在官方的盒子中。
    纽约风格芝士披萨:
        面团: 薄的面团
        酱汁: 番茄酱
        奶酪: 新鲜的奶酪
    
    迈克订购了一个 纽约风格芝士披萨
    
    准备: 芝加哥风格文蛤披萨
    烘烤25分钟在350。
    切割成对角线切片。
    放在官方的盒子中。
    芝加哥风格文蛤披萨:
        面团: 厚的生面团
        酱汁: 蘑菇酱
        文蛤: 冷冻的文蛤
    
    约翰订购了一个芝加哥风格文蛤披萨
    
  • 相关阅读:
    Spring Boot中Bean对象的核心特性及依赖注入分析
    Spring Boot快速入门
    throw和throws
    Spring框架中的一些常见注释
    关于maven的介绍并创建一个简单的maven工程
    luffyapi~settings
    爬虫~requests
    爬虫~scrapy1
    爬虫~scrapy
    爬虫~选择器
  • 原文地址:https://www.cnblogs.com/zxlovenet/p/4066549.html
Copyright © 2011-2022 走看看