《 Head First 》学习笔记:工厂模式 和 抽象模式 (python实现)

今天看 《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 , 而不会影响到其它代码 。

难点是,你必须在明确需求的时候,才能使用工厂模式,不然只会让代码复杂化。
《 Head First 》学习笔记:工厂模式 和 抽象模式 (python实现)_第1张图片


抽象模式代码:

上面的批萨店并不适用于抽象工厂模式,因为各地的批萨店是平行的关系,下面翻译了一个书中的例子:批萨原料

上面的例子中,有深圳店,广州店,还有惠州店,但是因为地理位置不同,他们想做出自己有口味批萨,他们会需要使用到不同的原料。那么该如何实现呢?看抽象工厂的实现

#!/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 》学习笔记:工厂模式 和 抽象模式 (python实现)_第2张图片


想要更好的理解,请看《Head First》的代码,我这边帖上来也没意思 。



你可能感兴趣的:(python,工厂模式,抽象模式)