您的位置:首页 > 编程语言 > Python开发

python风格的抽象工厂模式

2014-11-01 11:21 183 查看
抽象工厂模式:

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

原则:

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

实例:

用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(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:\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):
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。
切割成对角线切片。
放在官方的盒子中。
芝加哥风格文蛤披萨:
面团: 厚的生面团
酱汁: 蘑菇酱
文蛤: 冷冻的文蛤

约翰订购了一个芝加哥风格文蛤披萨
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: