一、什么是建造模式:

  建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程生成具有不同内部表象的产品。客户端不需要知道产品内部的结构和生产过程。

二、建造模式的结构:

  Builder(抽象建造者角色):一个抽象的建造者父类结构,规定产品对象各个组成成分的建造。

  ConcreteBuilder(产品的具体建造者):继承抽象建造者角色,实现建造方法buildPart1()、builderPart2(),完成产品零件实例的创建;返回产品实例的方法retrieveResultProuduct(),一般而言零件数和产品的建造方法数相同。

  Prouduct(产品):具体建造者建造的对象。

  Director(导演者角色):调用具体产品的创建者 ,获取产品对象。

  总之,导演者角色与客户端直接打交道,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委托给具体的建造者角色,具体建造者角色生产具体的零件,不被客户端所知。

 /**
* 建造者模式产品对象
*
* @author ZhouDX
* @since 2019/3/6 22:02:58
*/
public class Product {
/**
* 产品Id
*/
private String prouductId;
/**
* 产品价格
*/
private String price; public String getProuductId() {
return prouductId;
} public void setProuductId(String prouductId) {
this.prouductId = prouductId;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
} @Override
public String toString() {
return "Product{" + "prouductId='" + prouductId + '\'' + ", price='" + price + '\'' + '}';
}
}

Prouduct(产品)

 /**
* 建造者模式建造者
*
* @author ZhouDX
* @since 2019/3/6 21:54:40
*/
public interface Builder {
/**
* 建造方法1
*/
public void method1(); /**
* 建造方法2
*/
public void method2(); /**
* 返回产品
*/
public Product returnResult();
}

Builder(抽象建造者角色)

 /**
* @author ZhouDX
* @since 2019/3/6 22:04:22
*/
public class ConcreteBuilder implements Builder {
private Product product = new Product(); @Override
public void method1() {
product.setProuductId("10000001");
} @Override
public void method2() {
product.setPrice("100");
} @Override
public Product returnResult() {
return product;
}
}

ConcreteBuilder(产品的具体建造者)

 /**
* @author ZhouDX
* @since 2019/3/6 22:07:41
*/
public class Director {
private Builder builder; /**
* 各个零件生产,获得完整的对象
*/
public void constructor() {
builder = new ConcreteBuilder();
builder.method1();
builder.method2();
builder.returnResult();
}
public Builder getBuilder() {
return builder;
}
}

Director (导演者对象)

 /**
* @author ZhouDX
* @since 2019/3/12 22:45:02
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
director.constructor();
Product product = director.getBuilder().returnResult();
System.out.println(product.toString());
}
}

Client (客户端)

三、建造模式的实质:

  建造模式利用一个导演者对象和具体建造者对象一个一个的建造出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程的指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

Java建造(Builder)模式的更多相关文章

  1. 建造(Builder)模式

    建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 摘自EffectiveJava:当构造方法参数过多时使用建造者模式. 产品的内部表象 ...

  2. Java之Builder模式(并用OC实现了这种模式)

    本人在学习Java,直接先学习Netty框架,因为Netty框架是业界最流行的NIO框架之一,在学习的过程中,了解到Netty服务端启动需要先创建服务器启动辅助类ServerBootstrap,它提供 ...

  3. Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求

    builder模式在越来越多的项目中使用,类似于alibaba fastjson JSONObject.fluentPut(),调用一个方法后返回这个对象本身,特别适合构建一些参数超级多的对象,代码优 ...

  4. java设计模式--Builder模式

    一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的 ...

  5. Java Builder模式 体验(二)

       在上篇文章中,对Java Builder模式的使用体验主要是从Builder对构造器改造方面的优秀特性来说的,感觉并没有从Java Builder模式本身的功能和作用去写,因此决定再从Build ...

  6. Java之建造者模式(Builder Pattern)(转)

    1.概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者 ...

  7. Builder模式在Java中的应用

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  8. 浅谈设计模式--建造器模式(Builder Pattern)

    建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...

  9. JAVA Builder模式构建MAP/LIST的示例

    我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...

  10. Builder模式在Java中的应用(转)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

随机推荐

  1. 改造MIP获得搜索青睐,轻松完成SEO

    搜索引擎目标及页面排序方法 搜索引擎作为互联网流量的入口,承担着流量分发的职责.但排序成千上万的网页,决定哪些网页在第一页,是由网页本身的用户体验决定的.权重算法会从内容优质性,广告多少,加载速度等多 ...

  2. [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。

    前言 最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底.总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice ...

  3. vue之$root,$parent

    $root vue状态管理使用vuex,如果项目不大,逻辑不多,name我们没必要用vuex给项目增加难度,只需要用$root设置vue实例的data就行了,如下 main.js new Vue({ ...

  4. jqgrid postData post方式累加参数,缓存了原来的数据

    今天做项目的时候发现一个问题,我们有一个筛选项,一个是VIP用户,一个是普通用户,还有一个是全部用户,首先看下我们的selection <select name="" id= ...

  5. 企业自主可控免费开源ERP:Odoo采购管理解决方案

    供应商基础资料 1. 所有的供应商基础资料,Odoo开账启用时,期初的客户数据如果大于200条,可以批量导入: 2. 点“采购/采购/供应商”菜单可以查看.编辑修改.搜索所有的供应商基础资料: 3. ...

  6. Android app去掉https签名校验

    本文同步至http://javaexception.com/archives/30 问题: 之前的一个开源项目碰到了一个问题,Fix CertPathValidatorException: Trust ...

  7. 一起学Android之Sqlite

    概述 Android对Sqlite提供了完全友好的支持,在应用程序内部,都可以通过名称访问任何的数据库.建议通过SQLiteOpenHelpe的子类并通过重写onCreate() 方法进行创建数据表. ...

  8. 外呼系统APP外呼软件手机电销软件拨号销售软件功能设计

    外呼系统APP外呼软件 1 系统概述 该软件系统设计功能主要为贷款.投资.资产管理等金融中介公司提供方便快捷的线上管理各类资源的一款应用软件工具. 可根据不同职位的账号登录APP来管理电话营销.客户签 ...

  9. LOJ #6050. 「雅礼集训 2017 Day11」TRI

    完全不会的数学神题,正解留着以后填坑 将一个口胡的部分分做法,我们考虑计算格点多边形(包括三角形)面积的皮克公式: \[S=a+\frac{1}{2}b-1\text({a为图形内部节点个数,b为边界 ...

  10. 第4章 简单的C程序设计——选择结构程序设计

    在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断.实际上,很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两 ...