简单工厂、工厂模式、抽象工厂模式
2016-02-28 20:23
375 查看
简单工厂其实不是一个设计模式,反而比较像是一种编程习惯
产品基类Pizza, 子类 CheesePizza、 PepperoniPizza、ClamPizza、VeggiePizza
顾客通过商店PizzaStore的order_pizza函数预订pizza。
而pizza的生产依赖SimpleFactory, 通过SimpleFactory的create_pizza获取实际的pizza 。
调用过程如下
完整代码如下:
工厂模式 通过让子类决定该创建的对象是什么, 达到将对象创建的过程封装的目的。
pizza的生产不再通过SimpleFactory , 而是把create_pizza放到PizzaStore中,并设置成抽象方法, 让继承PizzaStore的子类在根据实际需要实现create_pizza
NYPizzaStore、ChicagoPizzaStore继承PizzaStore,并实现对应的create_pizza
抽象工厂方法
提供一个接口, 用于创建相关或依赖对象的家族,而不需要指明具体类
在上个例子的基础上,增加了原料工厂
产品基类Pizza, 子类 CheesePizza、 PepperoniPizza、ClamPizza、VeggiePizza
顾客通过商店PizzaStore的order_pizza函数预订pizza。
而pizza的生产依赖SimpleFactory, 通过SimpleFactory的create_pizza获取实际的pizza 。
调用过程如下
pizza_store = PizzaStore(SimplePizzaFactory()) pizza_store.order_pizza('cheese') pizza_store.order_pizza('clam')
完整代码如下:
# coding:utf-8
import inspect
# pizza接口 实际pizza子类
class Pizza(object):
def __init__(self):
print 'create a %s' % self
def prepare(self):
print '%s-->prepare' % self
def bake(self):
print '%s-->Bake' % self
def cut(self):
print '%s-->cut' % self
def box(self):
print '%s-->box' % self
def __str__(self):
return self.__class__.__name__
class CheesePizza(Pizza): pass
class ClamPizza(Pizza): pass
class SimplePizzaFactory:
def create_pizza(self, type):
if type == 'cheese':
pizza = CheesePizza()
elif type == 'clam':
pizza = ClamPizza()
else:
pizza = None
return pizza
class PizzaStore:
def __init__(self, factory):
self.factory = factory
def order_pizza(self, type):
pizza = self.factory.create_pizza(type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
pizza.box()
return pizza
pizza_store = PizzaStore(SimplePizzaFactory()) pizza_store.order_pizza('cheese') pizza_store.order_pizza('clam')
工厂模式 通过让子类决定该创建的对象是什么, 达到将对象创建的过程封装的目的。
pizza的生产不再通过SimpleFactory , 而是把create_pizza放到PizzaStore中,并设置成抽象方法, 让继承PizzaStore的子类在根据实际需要实现create_pizza
NYPizzaStore、ChicagoPizzaStore继承PizzaStore,并实现对应的create_pizza
# coding:utf-8 import inspect # pizza接口 实际pizza子类 class Pizza(object): def __init__(self): print 'create a %s' % self def prepare(self): print '%s-->prepare' % self def bake(self): print '%s-->Bake' % self def cut(self): print '%s-->cut' % self def box(self): print '%s-->box' % self def __str__(self): return self.__class__.__name__ class NYCheesePizza(Pizza):pass class NYClamPizza(Pizza):pass class ChicagoCheesePizza(Pizza):pass class ChicagoClamPizza(Pizza):pass # pizza商店 和实际子类商店 class PizzaStore(object): def order_pizza(self, type): pizza = self.create_pizza(type) pizza.prepare() pizza.bake() pizza.cut() pizza.box() return pizza def create_pizza(self, type): raise NotImplemented() class NYPizzaStore(PizzaStore): def create_pizza(self, type): if type == 'cheese': pizza = NYCheesePizza() elif type == 'clam': pizza = NYClamPizza() else: pizza = None return pizza class ChicagoPizzaStore(PizzaStore): def create_pizza(self, type): if type == 'cheese': pizza = ChicagoCheesePizza() elif type == 'clam': pizza = ChicagoClamPizza() else: pizza = None return pizza pizza_store = NYPizzaStore() pizza_store.order_pizza('cheese') pizza_store = ChicagoPizzaStore() pizza_store.order_pizza('cheese')
抽象工厂方法
提供一个接口, 用于创建相关或依赖对象的家族,而不需要指明具体类
在上个例子的基础上,增加了原料工厂
# coding:utf-8 import inspect # 原料接口 和实际原料子类 class Dough(object): def get_name(self): raise NotImplemented class ThickCrustDough(Dough): def get_name(self): return 'Thick Crust Dough' class ThinCrustDough(Dough): def get_name(self): return 'Thin Crust Dough' class Sauce(object): def get_name(self): raise NotImplemented class PlumTomatoSauce(object): def get_name(self): return 'Plum Tomato Sauce' class MainaraSauce(object): def get_name(self): return 'Mainara Sauce' #原料工厂 和实际原料工厂子类 class PizzaIngredientFactory(object): def createDough(self): raise NotImplemented() def createSauce(self): raise NotImplemented() class NYPizzaIngredientFactory(PizzaIngredientFactory): def createDough(self): return ThickCrustDough() def createSauce(self): return PlumTomatoSauce() class ChicagoPizzaIngredientFactory(PizzaIngredientFactory): def createDough(self): return ThinCrustDough() def createSauce(self): return MainaraSauce() # pizza接口 实际pizza子类 class Pizza(object): def __init__(self): print 'create a %s' % self self.dough = None self.sauce = None def prepare(self): raise NotImplemented() def show_ingredient(self): print 'has ingredient:', self.sauce.get_name(), ';', self.dough.get_name() def bake(self): print '%s-->Bake' % self def cut(self): print '%s-->cut' % self def box(self): print '%s-->box' % self def __str__(self): return self.__class__.__name__ class NYCheesePizza(Pizza): def __init__(self, ingredientFactory): self.ingredientFactory = ingredientFactory super(NYCheesePizza, self).__init__() def prepare(self): print 'NYCheesePizza Pareparing ...' self.dough = self.ingredientFactory.createDough() self.sauce = self.ingredientFactory.createSauce() class NYClamPizza(Pizza): def __init__(self, ingredientFactory): self.ingredientFactory = ingredientFactory super(NYClamPizza, self).__init__() def prepare(self): print 'NYClamPizza Pareparing ...' self.dough = self.ingredientFactory.createDough() self.sauce = self.ingredientFactory.createSauce() class ChicagoCheesePizza(Pizza): def __init__(self, ingredientFactory): self.ingredientFactory = ingredientFactory super(ChicagoCheesePizza, self).__init__() def prepare(self): print 'ChicagoCheesePizza Pareparing ...' self.dough = self.ingredientFactory.createDough() self.sauce = self.ingredientFactory.createSauce() class ChicagoClamPizza(Pizza): def __init__(self, ingredientFactory): self.ingredientFactory = ingredientFactory super(ChicagoClamPizza, self).__init__() def prepare(self): print 'ChicagoClamPizza Pareparing ...' self.dough = self.ingredientFactory.createDough() self.sauce = self.ingredientFactory.createSauce() # pizza商店 和实际子类商店 class PizzaStore(object): def order_pizza(self, type): pizza = self.create_pizza(type) pizza.prepare() pizza.show_ingredient() pizza.bake() pizza.cut() pizza.box() return pizza def create_pizza(self, type): raise NotImplemented() class NYPizzaStore(PizzaStore): def create_pizza(self, type): ingreientfactory = NYPizzaIngredientFactory() if type == 'cheese': pizza = NYCheesePizza(ingreientfactory) elif type == 'clam': pizza = NYClamPizza(ingreientfactory) else: pizza = None return pizza class ChicagoPizzaStore(PizzaStore): def create_pizza(self, type): ingreientfactory = ChicagoPizzaIngredientFactory() if type == 'cheese': pizza = ChicagoCheesePizza(ingreientfactory) elif type == 'clam': pizza = ChicagoClamPizza(ingreientfactory) else: pizza = None return pizza pizza_store = NYPizzaStore() pizza_store.order_pizza('cheese') pizza_store = ChicagoPizzaStore() pizza_store.order_pizza('cheese')
相关文章推荐
- 数据结构9-队列复习大纲
- Java 反射机制
- 变量地址和赋值
- android studio问题-ICCP:Not recognizing known sRGB profile
- xml文件解析(一)——xml文件格式
- Ajax中的get与post方式区别
- 【线扫描填充算法】用例过程图解
- 数据结构8-栈复习大纲
- margin叠加相邻两个元素的上下margin是叠加在一起
- ReactNative入门(安卓)——API(上)
- python(4)-迭代器 和 生成器
- 函数指针与回调函数
- Java-集合框架Map之HashMap、TreeMap
- MATLAB运算符
- Widget、Timer、TimerTask、Handler、Message的综合使用
- nyoj108 士兵杀敌(一) (线段树)
- 2015年终总结
- 数据结构-7
- Android 4.2蓝牙介绍
- 关于github中的README.md文件