建造者模式(生成器模式)
2014-08-07 14:31
190 查看
转载请注明出处!!!http://blog.csdn.net/zhonghuan1992
所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern
建造者模式也叫做生成器模式,定义为:封装一个产品的构造过程,并且按此步骤构造。
建造者模式(生成器模式)属于创建类模式,和工厂模式相比,你会觉得有点类似,但是有区别之处。不过,建议在看下去之前,得明白三个工厂模式,如果你记得不太清楚了,可以看这里,简单工厂,工厂方法,抽象工厂。
UML类图:
看一下uml类图。这一部分,如果不清楚,可以先看下面的场景部分,再回过头来看。
![](https://img-blog.csdn.net/20140807142920250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从上面的类图中,可以看到有四个要素。
1 AbstractBuilder(抽象建造者):引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般会有两部分抽象方法,一部分用来建造产品,一个是用来返回产品。如上面,buildPart1和buildPart2用来构造产品,retrieveResult返回产品。
2 ConcreteBuilder(具体建造者):实现抽象建造者的抽象方法,之所以这样,是为了便于不同情况下的扩充。
3 Director(导演者):负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
4 Product(产品类):一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
场景导入:
假设有这样的要求,去游乐场玩,游乐场有很多可以供娱乐的地方。比如有旋转木马,过山车,摩天轮,海盗船等等。当我们去玩得时候,至少不会胡来,自己还是有点计划的对吧。比如,小明想先去玩过山车(比较喜欢刺激的人),接着摩天轮,然后海盗船,最后旋转木马;另外一个小朋友也去玩,他想先玩摩天轮,接着。。。。,等等。假设每个人的计划就是我们需要的产品,那么,如果你用工厂模式,如何去设计把这个产品生成出来呢,当然,你一定可以想一些方法,即使不合适,但也可行。这里,比较合适的方法应该是生成器模式。
重新定义场景:暂时定游乐场一共有3个活动,分别是,摩天轮,海盗船,过山车。现在我们的产品是要出一份计划,是先玩哪个,全部玩,还是只玩一个,这个计划就是产品。
让我们看一下实现的代码:
输出:
![](https://img-blog.csdn.net/20140807143234370?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmdodWFuMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
现在有一个小朋友,他指向玩一个摩天轮,那么根据他的要求,改变的只是Director的部分。更改代码吐下:
假设有一个小朋友,计划玩两次过山车(刺激男孩),那么,依旧只需更改Director的部分。
建造者模式的优点,从上面我们可以体会出一点,product和builder部分一般不变,但是当有新的要求,Director部分可以通过变更满足这些要求。这种将业务逻辑封装在导演类(Director)中的方式,对整体而言会有更好的稳定性。
简单论述工厂与建造者(生成器)模式的区别:
工厂主要变更的地方是产品的变更,而builder 模式主要变更的地方则是director,就是组装的变更。工厂更倾向基本组件的生产,而builder是这些基本组件的组装。个人觉得这两个是可以结合起来的。工厂更基本,builder更高层。
所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern
跟着ZHONGHuan学习设计模式
建造者模式(生成器模式)
简介:建造者模式也叫做生成器模式,定义为:封装一个产品的构造过程,并且按此步骤构造。
建造者模式(生成器模式)属于创建类模式,和工厂模式相比,你会觉得有点类似,但是有区别之处。不过,建议在看下去之前,得明白三个工厂模式,如果你记得不太清楚了,可以看这里,简单工厂,工厂方法,抽象工厂。
UML类图:
看一下uml类图。这一部分,如果不清楚,可以先看下面的场景部分,再回过头来看。
从上面的类图中,可以看到有四个要素。
1 AbstractBuilder(抽象建造者):引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般会有两部分抽象方法,一部分用来建造产品,一个是用来返回产品。如上面,buildPart1和buildPart2用来构造产品,retrieveResult返回产品。
2 ConcreteBuilder(具体建造者):实现抽象建造者的抽象方法,之所以这样,是为了便于不同情况下的扩充。
3 Director(导演者):负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
4 Product(产品类):一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
场景导入:
假设有这样的要求,去游乐场玩,游乐场有很多可以供娱乐的地方。比如有旋转木马,过山车,摩天轮,海盗船等等。当我们去玩得时候,至少不会胡来,自己还是有点计划的对吧。比如,小明想先去玩过山车(比较喜欢刺激的人),接着摩天轮,然后海盗船,最后旋转木马;另外一个小朋友也去玩,他想先玩摩天轮,接着。。。。,等等。假设每个人的计划就是我们需要的产品,那么,如果你用工厂模式,如何去设计把这个产品生成出来呢,当然,你一定可以想一些方法,即使不合适,但也可行。这里,比较合适的方法应该是生成器模式。
重新定义场景:暂时定游乐场一共有3个活动,分别是,摩天轮,海盗船,过山车。现在我们的产品是要出一份计划,是先玩哪个,全部玩,还是只玩一个,这个计划就是产品。
让我们看一下实现的代码:
import java.util.ArrayList; //假设产品是一份计划 class Plan{ public ArrayList<String> list = new ArrayList<String>(); void add(String str){ list.add(str); System.out.println("将\""+str+"\"加入计划"); } void Out(){//打印出计划的内容 System.out.println("计划内容如下:"); for(String tmp:list){ System.out.println(tmp); } } } interface AbstractBuilder{ void addRollerCoaster();//将过山车加入计划 void addFerrisWheel();//将摩天轮加入计划 void addPirateShip();//将海盗船加入计划 Plan retrievePlan();//返回计划 } class ConcreteBuilder implements AbstractBuilder{ Plan plan = new Plan(); public void addRollerCoaster(){//将过山车加入计划 plan.add("roller coaster"); } public void addFerrisWheel(){//将摩天轮加入计划 plan.add("ferris wheel"); } public void addPirateShip(){//将海盗船加入计划 plan.add("pirate ship"); } public Plan retrievePlan()//返回计划 { return plan; } } class Director{ public void construct(){ AbstractBuilder builder=new ConcreteBuilder(); builder.addRollerCoaster(); builder.addFerrisWheel(); builder.addPirateShip(); builder.addRollerCoaster();//玩第二次 //构建完毕后,我们就得到了我们的计划 Plan plan=builder.retrievePlan(); plan.Out();//打印出计划的内容 } } public class Main{ public static void main(String[] args){ Director dir=new Director(); dir.construct(); } }
输出:
现在有一个小朋友,他指向玩一个摩天轮,那么根据他的要求,改变的只是Director的部分。更改代码吐下:
class Director{ public void construct(){ AbstractBuilder builder=new ConcreteBuilder(); builder.addFerrisWheel(); //构建完毕后,我们就得到了我们的计划 Plan plan=builder.retrievePlan(); plan.Out();//打印出计划的内容 } }
假设有一个小朋友,计划玩两次过山车(刺激男孩),那么,依旧只需更改Director的部分。
class Director{ publicvoid construct(){ AbstractBuilder builder=new ConcreteBuilder(); builder.addRollerCoaster(); builder.addFerrisWheel(); builder.addPirateShip(); builder.addRollerCoaster();//玩第二次 //构建完毕后,我们就得到了我们的计划 Plan plan=builder.retrievePlan(); plan.Out();//打印出计划的内容 } }
建造者模式的优点,从上面我们可以体会出一点,product和builder部分一般不变,但是当有新的要求,Director部分可以通过变更满足这些要求。这种将业务逻辑封装在导演类(Director)中的方式,对整体而言会有更好的稳定性。
简单论述工厂与建造者(生成器)模式的区别:
工厂主要变更的地方是产品的变更,而builder 模式主要变更的地方则是director,就是组装的变更。工厂更倾向基本组件的生产,而builder是这些基本组件的组装。个人觉得这两个是可以结合起来的。工厂更基本,builder更高层。
相关文章推荐
- 建造者模式(生成器模式)
- 设计模式学习-----建造者模式(生成器模式)
- java设计模式——Builder(建造者模式(生成器模式))
- 设计模式解密(6) - 建造者模式(生成器模式)
- c++设计模式(建造者模式(生成器模式))
- 建造者模式(生成器模式)
- (创建型模式)BUILDER——建造者模式(生成器模式)
- 生成器模式(又名建造者模式、Builder Pattern)
- 建造者模式(生成器模式)
- JAVA设计模式---建造者模式(生成器模式)
- 设计模式学习——建造者模式(Builder Pattern)/生成器模式
- 【设计模式】建造者模式(生成器模式)
- 建造者模式(生成器模式)
- 建造者模式(生成器模式)
- 建造者模式(生成器模式)
- (创建型模式)Builder——建造者模式(生成器模式)
- 建造者模式(生成器模式)
- 设计模式-------------建造者模式(生成器模式)
- 5.建造者模式(生成器模式)
- 建造者模式(生成器模式)