首页 > 代码库 > python风格的抽象工厂模式

python风格的抽象工厂模式

抽象工厂模式:

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

原则:

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

实例:

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

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

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

代码:

#!/usr/bin/python# -*- coding:utf-8 -*-import sysreload(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:\n" % self.name         string += "    面团: %s\n" % self.dough.to_string() if self.dough else ""        string += "    酱汁: %s\n" % self.sauce.to_string() if self.sauce else ""        string += "    奶酪: %s\n" % self.cheese.to_string() if self.cheese else ""        string += "    文蛤: %s\n" % 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):        passclass ThinDough(Dough):    def to_string(self):        return "薄的面团"class ThickDough(Dough):    def to_string(self):        return "厚的生面团"class Sauce:    def to_string(self):        passclass MarinaraSauce(Sauce):    def to_string(self):        return "番茄酱"class MushroomSauce(Sauce):    def to_string(self):        return "蘑菇酱"class Cheese:    def to_string(self):        passclass FreshCheese(Cheese):    def to_string(self):        return "新鲜的奶酪"class BlueCheese(Cheese):    def to_string(self):        return "蓝纹奶酪"class Clam:    def to_string(self):        passclass 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。切割成对角线切片。放在官方的盒子中。芝加哥风格文蛤披萨:    面团: 厚的生面团    酱汁: 蘑菇酱    文蛤: 冷冻的文蛤约翰订购了一个芝加哥风格文蛤披萨

 

python风格的抽象工厂模式