简介

  建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。

角色

  • 产品(Product):产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
  • 抽象建造者(Builder):一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildHead buildBody和buildFoot),另一种是返还产品方法(retrieveProduct)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件就有多少相应的建造方法(所有组件)。
  • 具体建造者(ConcreteBuilder):担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
  • 导演者(Director):担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体操作,真正拥有产品类的具体操作的是具体建造者角色。

  导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
  一般来说,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就相应地在所有的建造者角色里有一个建造方法。
  建造模式利用一个导演者对象和具体建造者对象一个个地建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

类图

源码

产品

public class Product {private String head;private String body;private String foot;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getFoot() {return foot;}public void setFoot(String foot) {this.foot = foot;}
}

抽象建造者

public interface Builder {public void buildHead();public void buildBody();public void buildFoot();public Product retrieveProduct();
}

具体建造者

public class ConcreteBuilder implements Builder {private Product product = new Product();public void buildHead() {product.setHead("头组装好了");}public void buildBody() {product.setBody("身体组装好了");}public void buildFoot() {product.setFoot("脚组装好了");}public Product retrieveProduct() {return product;}
}

导演

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void buildProduct() {   builder.buildHead();builder.buildBody();builder.buildFoot();}
}

客户端&结果

    public static void main(String[] args) throws Exception {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.buildProduct();Product product = builder.retrieveProduct();System.out.println(product.getHead());
//      结果:头组装好了}

不同

建造者模式与抽象工厂模式的比较:

  • 与抽象工厂模式相比, 建造者模式返回一个组装好的完整产品 ,而 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
  • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
  • 如果将抽象工厂模式看成 汽车配件生产工厂 ,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂 ,通过对部件的组装可以返回一辆完整的汽车。

转载于:https://www.cnblogs.com/manusas/p/7526808.html

建造者模式Builder相关推荐

  1. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  2. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  3. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  4. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  5. 大话设计模式--建造者模式 Builder -- C++实现实例

    1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...

  6. 一天一个设计模式之建造者模式(Builder)

    建造者模式,属于创建型模式,其目的在于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用情况: • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. ...

  7. Activiti源码之建造者模式 Builder

    建造者模式介绍 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类 ...

  8. 设计模式之建造者模式(Builder)

    建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...

  9. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

最新文章

  1. 极大似然估计_极大似然估计、极大后验估计和贝叶斯估计
  2. firedac的TFDStoredProc动态创建并调用存储过程
  3. iframe嵌入页面白屏_Vue使用iframe嵌入第三方网页并修改标题
  4. [转]淘宝下单高并发解决方案
  5. Redis入门(暂不更新)
  6. JPA EntityListeners中的Spring注入的Bean
  7. 前端学习(1982)vue之电商管理系统电商系统之删除参数的操作
  8. JavaScript JSON数据格式
  9. Java实现计算饮料价格GUI版(入门)
  10. [置顶] 杂七杂八
  11. html搜索框如何加下拉框,js实现带搜索功能的下拉框
  12. 30个最快速的Webnbsp;Proxy代理
  13. flink on k8s模式通过web UI界面查看任务运行情况
  14. opencore 引导 近完美 黑苹果EFI(技嘉H310/I5-9400F/RX560D)
  15. python:批量分割图片(把一张图片横向平均分割成7张)
  16. GitHub上提交代码之写给小白
  17. pandas文件保存操作
  18. poi-tl实现word文档按模板下载
  19. 影创科技孙立:江西将成为施展“鸿鹄”之志的热土
  20. PC电源的保持时间是用来做什么的?

热门文章

  1. CO2 convex sets
  2. php手机电脑,php实现用手机关闭计算机(电脑)的方法
  3. C/C++指针数组与数组指针彻底搞明白
  4. arm linux 进程页表,arm-linux内存页表创建
  5. java环境变量设置 重启吗_java环境变量配置,原来是这样的
  6. 机器学习算法工程师面试经验谈:以个性化推荐算法为例
  7. xgboost融合模型:大学助学金精准资助预测(有数据)
  8. java二次方程式答案_二次方程式Java?
  9. 将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML
  10. Ruby设计模式透析之 —— 单例(Singleton)