zoukankan      html  css  js  c++  java
  • 创造者模式

    模式说明

    建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

    建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例。

    和工厂方法很像,创造者是一个builder内每个方法分别创建产品零部件,而工厂方法是每个factory生产一个产品。如果把builder的零部件当做一个完整产品呢?是不是就像 builder又再一次封装了factory~

    模式结构图

    程序示例

    说明:

    一个套餐类,两个派生套餐(每个套餐有不同食品);一个创造者类,两个派生创造者分别创建两种套餐;一个指挥者用来设定要创造哪个套餐。

    程序:

     1 class Meal(object):
     2     _food=''
     3     _drink=''
     4     def setfood(self,food):
     5         self._food=food
     6     def setdrink(self,drink):
     7         self._drink=drink
     8     def getfood(self):
     9         return self._food
    10     def getdrink(self):
    11         return self._drink
    12 
    13 class MealBuilder(object):
    14     _meal = Meal()
    15     def buildFood(self):
    16         pass
    17 
    18     def buildDrink(self):
    19         pass
    20 
    21     def getMeal(self):
    22         return self.meal
    23 
    24 
    25 class MealABuilder(MealBuilder):
    26     def buildFood(self):
    27         self._meal.setfood('meal A food')
    28     def buildDrink(self):
    29         self._meal.setdrink('meal A drink')
    30 
    31 class MealBBuilder(MealBuilder):
    32     def buildFood(self):
    33         self._meal.setfood('meal B food')
    34     def buildDrink(self):
    35         self._meal.setdrink('meal B drink')
    36 
    37 class director(object):
    38     _mealuilder = MealBuilder()
    39     def setBuilder(self,mealBuilder):
    40         self._mealuilder = mealBuilder
    41     def PrepareMeal(self):
    42         self._mealuilder.buildDrink()
    43         self._mealuilder.buildFood()
    44         return self._mealuilder._meal
    45 
    46 
    47 if __name__=='__main__':
    48     mealbuilder = MealABuilder()
    49     waitor = director()
    50     waitor.setBuilder(mealbuilder)
    51     meal = waitor.PrepareMeal()
    52     print meal.getdrink()+"	"+meal.getfood()
    53 
    54     mealbuilder = MealBBuilder()
    55     waitor = director()
    56     waitor.setBuilder(mealbuilder)
    57     meal = waitor.PrepareMeal()
    58     print meal.getdrink()+"	"+meal.getfood()

    运行效果:

    参考来源:

    http://www.cnblogs.com/chenssy/p/3679190.html

    http://www.cnblogs.com/wuyuegb2312/archive/2013/04/09/3008320.html

    http://www.cnblogs.com/Terrylee/archive/2006/07/17/334911.html

  • 相关阅读:
    【科技】扩展Lucas随想
    【NOI 2018】屠龙勇士(扩欧)
    【NOI 2018】冒泡排序(组合数学)
    【NOI 2018】归程(Kruskal重构树)
    【APIO 2018】铁人两项(圆方树)
    【科技】KD-tree随想
    UOJ#207. 共价大爷游长沙 LCT
    UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT
    UOJ#33. 【UR #2】树上GCD 点分治 莫比乌斯反演
    UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何
  • 原文地址:https://www.cnblogs.com/cotton/p/3930821.html
Copyright © 2011-2022 走看看