概述:
 
       构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来。使得相同的构建过程能够创建不同的表示,又称为生成器模式。

     Builder模式 主要用于“构建一个复杂的对象”。

把复杂对象的创建过程加以抽象,通过子类继承和重写方法。来得到具有复合属性的对象。

      同一时候为了统一创建过程,把对象的创建操作统一封装到Director的方法中。

      因为一个复杂对象的单个属性可能会发生变化(比如:制造汽车时使用的某一部件属于不同的厂家)可是整个复杂对象的构建过程却不会发生变化(比如:汽车的构建图纸已经固定,仅仅须要把部件依照图纸装配好)

    GOF:讲一个复杂对象的构建与其表示相分离,使得同样的构建过程能够创建不同的表示。即构建过程同样,可是子部件却不同样。

抽象工厂注重的是不同的工厂生产不同的产品。builder注重的是某个产品由不同的零件组成,产品的生产project。
Director就是负责产品组装的。是控制生产过程的;而builder是负责产品部件生产的。这样就实现了“过程”和“部件”的解耦。

抽象工厂通过不同的构建过程生成不同的对象表示,而Builder模式通过同样的构建过程生成不同的表示。

适用性:

    
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

    2.当构造过程必须同意被构造的对象有不同的表示时。

结构图(Struct):  

生活中的样例:

             



import java.util.ArrayList;

抽象的创建者类。主要给详细的创建者类创建模板。详细的创建者继承该类后,重写方法。用自己的方式创建风格不同的复杂对象的属性。但整体复杂对象的结构已经固定。

  1. abstract class Builder{
  2. public abstract void BuildDoor();
  3. public abstract void BuildWall();
  4. public abstract void BuildWindows();
  5. public abstract void BuildHouseCeiling();
  6. public abstract House GetHouse();
  7. }

具有复杂属性的对象。

  1. class House{
  2. private ArrayList <String>parts=new ArrayList<String>();
  3. public void add(String str){
  4. parts.add(str);
  5. }
  6. public void show()
  7. {
  8. for(String part:parts)
  9. {
  10. System.out.println(part+"\t");
  11. }
  12. System.out.println("\n");
  13. }
  14.  
  15. }

统一创建的过程。将创建过程统一。也能够有详细的流程

  1. class Director{
  2. public void construct(Builder builder){
  3. builder.BuildDoor();
  4. builder.BuildWall();
  5. builder.BuildWindows();
  6. builder.BuildHouseCeiling();
  7. }
  8. }

详细的创建者类,负责创建具有不同表示的复杂对象

  1. class ChineseBuilder extends Builder{
  2. private House chineseHouse=new House();
  3. public void BuildDoor() {
  4. chineseHouse.add("ChineseDoor");
  5. }
  6. public void BuildWall() {
  7. chineseHouse.add("ChineseWall");
  8. }
  9. public void BuildWindows() {
  10. chineseHouse.add("ChineseWindows");
  11. }
  12. public void BuildHouseCeiling() {
  13. chineseHouse.add("ChineseHouserCeiling");
  14. }
  15. public House GetHouse() {
  16. return chineseHouse;
  17. }
  18.  
  19. }
  20.  
  21. class EnglandBuilder extends Builder{
  22. private House englandHouse=new House();
  23. public void BuildDoor() {
  24. englandHouse.add("EnglandDoor");
  25. }
  26. public void BuildWall() {
  27. englandHouse.add("EnglandWall");
  28. }
  29. public void BuildWindows() {
  30. englandHouse.add("EnglandWindows");
  31. }
  32. public void BuildHouseCeiling() {
  33. englandHouse.add("EnglandHouserCeiling");
  34. }
  35. public House GetHouse() {
  36. return englandHouse;
  37. }
  38.  
  39. }
  40. public class BuilderPattern {
  41. public static void main(String[] args) {
  42. Builder chineseBuilder=new ChineseBuilder();
  43. Builder englandBuilder=new EnglandBuilder();
  44. Director director=new Director();
  45. director.construct(chineseBuilder);
  46. House chineseHouse=chineseBuilder.GetHouse();
  47. chineseHouse.show();
  48. director.construct(englandBuilder);
  49. House englandHouse=englandBuilder.GetHouse();
  50. englandHouse.show();
  51. }
  52.  
  53. }

在这里转贴一下这位

forumID=125&amp;threadID=28019&amp;messageID=241582" style="text-decoration:none; color:rgb(8,68,135); font-family:simsun; font-size:14px; line-height:21px; background-color:rgb(235,235,235)">richardluo的比喻



简单地说,就好象我要一座房子住,但是我不知道怎么盖(简单的砌墙。层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我须要找一帮民工。他们会砌墙。还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导。而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门。这样民工開始建设,最后,我能够向民工要房子了。在这个过程中,设计师是什么也没有。除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!



下面是richardluo的代码,我依据他的思路加上了对应的凝视。



1,定义工人接口,就是可以完毕建造房子任务的人的通用要求。

java 代码
 
  1. // 工人接口。定义了各个工人所要进行的工所作。

    他们负责进行详细部件如窗户。地板的建造。

  2. // 同一时候由于房子是民工建的,因此建设完毕后由他把房子递交回房主
  3. public interface Builder {
  4. public  void makeWindow();
  5. public  void makeFloor();
  6. public  Room  getRoom();
  7. }

2,定义设计师。他的职责是指挥房主指派给他的工人依照自己的设计意图建造房子。

java 代码
 
  1. // 设计师。他知道房子应该怎么设计,但他不会自己去建造,而是指挥民工去建造。

  2. public class Designer {
  3. // 指挥民工进行工作
  4. public void order(Builder  builder) {
  5. builder.makeWindow();
  6. builder.makeFloor();
  7. }
  8. }

3,民工,他负责详细事物的实施。

java 代码
 
  1. // 民工。负责进行详细部件如窗户,地板的建造。

  2. //同一时候由于房子是民工建的,因此建设完毕后由他把房子递交回房主
  3. public class Mingong  implements Builder {
  4. private  String window="";
  5. private  String floor="";
  6. public  void makeWindow() {
  7. window=new String("window");
  8. }
  9. public  void makeFloor(){
  10. floor=new String("floor");
  11. }
  12. // 回交房子给房主
  13. public  Room  getRoom() {
  14. if((!window.equals(""))&&(!floor.equals(""))) {
  15. System.out.println("room ready!");
  16. return new Room();
  17. }
  18. else return null;
  19. }
  20. }

4,房主,就是雇人,收房。

java 代码
 
  1. // 房主。房主的任务就是聘请一个民工,一个设计师,同一时候把民工给设计师指挥,督促设计师开展工作。

    最后从民工手上收房。

  2. public class Client {
  3. public static void main(String[] args) {
  4. Builder mingong = new Mingong();
  5. Designer  designer = new  Designer();
  6. designer.order(mingong);
  7. mingong.getRoom();
  8. }
  9. }

本文借鉴:http://blog.csdn.net/jiafu1115/article/details/6668563

http://luchar.iteye.com/blog/179619

http://blog.sina.com.cn/s/blog_66f2257c0100i9yi.html

《Java设计模式》之构建者模式的更多相关文章

  1. 深入探索Java设计模式之构建器模式(五)

    抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...

  2. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  3. Java设计模式之《外观模式》及应用场景

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...

  4. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  5. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  6. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  7. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  8. Java设计模式之《模板模式》及使用场景

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9558825.html 模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框 ...

  9. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

  10. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

随机推荐

  1. layui 的Tab选项卡

    http://www.layui.com/doc/element/tab.html <#--start--> <div class="layui-tab layui-tab ...

  2. Spring Boot学习——统一异常处理

    本随笔记录使用Spring Boot统一处理异常. 本文实例是从数据库中根据ID查询学生信息,要求学生的年龄在14——20岁之间.小于14岁,提示“你可能在上初中”:大于20岁,提示“呢可能在上大学” ...

  3. LeetCode OJ-- Edit Distance **

    https://oj.leetcode.com/problems/edit-distance/ 动态规划,它的小规模问题是:当 word1  word2都比较小的时候,word1变成 word2需要的 ...

  4. Node.js应用场景及发展趋势

    node主要应用场景是在大前端,阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接受人家生成好的数据,然后或渲染后,或直接发送到客户端.如果让node做复杂的业务逻 ...

  5. Spring MVC通过Pageable对象和PageableDefault注解获取分页信息(MongoDB通过Pageable来操作分页)

    说明:Pageable同时也能用于操作MongoDB的分页. PageableSpring Data库中定义的一个接口,该接口是所有分页相关信息的一个抽象,通过该接口,我们可以得到和分页相关所有信息( ...

  6. 11i REP-3000: 启动 Oracle Toolkit 时发生内部错误.

    +---------------------------------------------------------------------------+ 应用对象程序库: Version : 11. ...

  7. django常用第三方app大全

    djangoapp 资源大全 最近经常在这个版面看到Django相关扩展的介绍,而其一个扩展写一个帖子,觉得没太必要吧. 以前整理的django资源列表,从我的wiki上转过来的. 要找django资 ...

  8. MFC中 自定义消息

    想在对话框显示出来后立即执行一段代码. 方法之一是自定义消息,即添加一个自定义的消息在消息队列中等待对话框初始化之后从消息队列中读取消息执行代码. 在OnInitDialog返回之前post一个自定义 ...

  9. 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...

  10. Android世界第一个activity启动过程

    Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...