今天看 《Head First》 第4章,书中用了几十页详细说了工厂模式和抽象模式。
一开始真不好理解工厂模式和抽象模式的区别,总结如下:
1、使用继承,由子类来决定创建具体对象
2、一种产品的平行结构 ,比如这“种”产品是批萨,批萨就有 水果批萨,培根批萨,牛肉批萨 这些平行的产品。
3、工厂模式一般只有一个创建的方法,根据你传入的对象,创建对应的对象
抽象模式:
1、提供接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
2、一个产品家族,家族中有一组产品,如批萨制造所需原料有:面团、酱欧、芝士、肉和蔬菜, 当别的类需要使用到时,可以根据自己的需要取出 抽象工厂中的 方法进行组合
3、抽象工厂会一组方法 ,创建多种产品对象。
代码展示:
工厂模式:
#!/usr/bin/python #-*- coding:utf8 -*- ######################## #在这个例子中,不必理会Pizza类 class Pizza(object): def __init__(self): super(Pizza,self).__init__() def getDescription(self): pass class CheesePizza(Pizza): def __init__(self): super(CheesePizza,self).__init__() self.description = 'cheese pizza' self.getDescription() def getDescription(self): print self.description class VeggiePizza(Pizza): def __init__(self): super(VeggiePizza,self).__init__() self.description = 'veggie pizza' self.getDescription() def getDescription(self): print self.description class ClamPizza(Pizza): def __init__(self): super(ClamPizza,self).__init__() self.description = 'clam pizza' self.getDescription() def getDescription(self): print self.description ####################### #创建一个批萨店,注意这是抽象类,负责接收客户的请求 class PizzaStore(object): def orderPizza(self,pizza_type): pass def createPizza(self,pizza_type): pass #具体的子类 class SZPizzaStore(PizzaStore): #深圳批萨店开张 def orderPizza(self,pizza_type): return self.createPizza(pizza_type) def createPizza(self,pizza_type): if pizza_type == 'cheese': #如果是芝士批萨,就返回一个批萨对象 pizza = CheesePizza() elif pizza_type == 'veggie': #深圳店才有的批萨 pizza = VeggiePizza() return pizza class GZPizzaStore(PizzaStore): #广州批萨店开张 def orderPizza(self,pizza_type): return self.createPizza(pizza_type) def createPizza(self,pizza_type): if pizza_type == 'cheese': #如果是芝士批萨,就返回一个批萨对象 pizza = CheesePizza() elif pizza_type == 'clam': #广州店才有的批萨 pizza = ClamPizza() return pizza if __name__ == '__main__': #假如你是在深圳 ,想叫个芝士批萨 pizza = SZPizzaStore() pizza.orderPizza('cheese') #假如你是在广州 ,想叫个clam批萨 pizza = GZPizzaStore() pizza.orderPizza('clam')你可以看到:
1、SZPizzaStore 、 GZPizzaStore 是平行的产品关系
2、SZPizzaStore 、 GZPizzaStore 是继承于PizzaStore的子类,由它们来决定创建哪些实例
这样的模式有什么好处? 一个是灵活性,一个是稳定性
假如你还要在惠州开一家店,你可以直接加入一个 HZPizzaStore , 而不会影响到其它代码 。
难点是,你必须在明确需求的时候,才能使用工厂模式,不然只会让代码复杂化。
抽象模式代码:
上面的批萨店并不适用于抽象工厂模式,因为各地的批萨店是平行的关系,下面翻译了一个书中的例子:批萨原料
上面的例子中,有深圳店,广州店,还有惠州店,但是因为地理位置不同,他们想做出自己有口味批萨,他们会需要使用到不同的原料。那么该如何实现呢?看抽象工厂的实现
#!/usr/bin/python #-*- coding:utf8 -*- ##################################### #抽象原料工厂,负责创建原料 class PizzaIngredientFactory(object): def __init__(self): super(PizzaIngredientFactory,self).__init__() def createDough(self): pass def createSauce(self): pass def createCheese(self): pass def createVeggies(self): pass def createPepperoni(self): pass ##################################### #深圳工厂,从抽象原料工厂中取得原料 class SZPizzaIngredientFactory(PizzaIngredientFactory): def __init__(self): super(SZPizzaIngredientFactory,self).__init__() def createDough(self): return "SZ Dough" def createSauce(self): return "SZ sauce" def createCheese(self): pass def createVeggies(self): pass def createPepperoni(self): pass #广州工厂 class GZPizzaIngredientFactory(PizzaIngredientFactory): def __init__(self): super(GZPizzaIngredientFactory,self).__init__() def createDough(self): return "SZ Dough" def createSauce(self): return "SZ sauce" def createCheese(self): pass def createVeggies(self): pass def createPepperoni(self): pass ######################## class Pizza(object): def __init__(self): super(Pizza,self).__init__() def getDescription(self): pass def prepare(self): pass def bake(self): pass def cut(self): pass def box(self): pass class CheesePizza(Pizza): def __init__(self,ingredientfactory): super(CheesePizza,self).__init__() self.ingredientfactory = ingredientfactory def prepare(self): print "取得芝士批萨所需的原料…………" dough = self.ingredientfactory.createDough() sauce = self.ingredientfactory.createSauce() cheese = self.ingredientfactory.createCheese() class ClamPizza(Pizza): def __init__(self,ingredientfactory): super(ClamPizza,self).__init__() self.ingredientfactory = ingredientfactory def prepare(self): print "取得蛤蜊批萨所需的原料…………" dough = self.ingredientfactory.createDough() veggies = self.ingredientfactory.createVeggies() ####################### #创建一个批萨店,注意这是抽象类,负责接收客户的请求 class PizzaStore(object): def orderPizza(self,pizza_type): pass def createPizza(self,pizza_type): pass #具体的子类 class SZPizzaStore(PizzaStore): #深圳批萨店开张 ingredientfactory = SZPizzaIngredientFactory() def orderPizza(self,pizza_type): return self.createPizza(pizza_type) def createPizza(self,pizza_type): if pizza_type == 'cheese': #深圳用自己特有的原料做出来的批萨 pizza = CheesePizza(self.ingredientfactory) #深圳工厂制造 elif pizza_type == 'clam': #深圳店才有的批萨 pizza = ClamPizza(self.ingredientfactory) return pizza class GZPizzaStore(PizzaStore): #广州批萨店开张 ingredientfactory = GZPizzaIngredientFactory() def orderPizza(self,pizza_type): return self.createPizza(pizza_type) def createPizza(self,pizza_type): if pizza_type == 'cheese': #广州用自己特有的原料做出来的批萨 pizza = CheesePizza(self.ingredientfactory) #广州工厂制造,非一般的味道 elif pizza_type == 'clam': #广州店才有的批萨 pizza = ClamPizza(self.ingredientfactory) return pizza if __name__ == '__main__': #假如你是在深圳 ,想叫个芝士批萨 pizza = SZPizzaStore() pizza.orderPizza('cheese') #假如你是在广州 ,想叫个clam批萨 pizza = GZPizzaStore() pizza.orderPizza('clam') 理解这段代码最好的办法就是自己敲一遍,并且画一遍UML图。抽象工厂就是提供一大推接口,由使用者选择组合哪些接口来实现具体的功能 。
想要更好的理解,请看《Head First》的代码,我这边帖上来也没意思 。