1. 概念

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 .

适用性:

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

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

参与者:

1.Builder为创建一个Product对象的各个部件指定抽象接口。

       2.ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。

3.Director 构造一个使用Builder接口的对象。

       4.Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口

2. 网络案例

package org.demo.builder;
/*** Function : * @author : Liaokailin* CreateDate : 2014-2-27* version : 1.0*/
/* Director*/class PersonDirector{public Person constructPerson(PersonBuilder pb){pb.buildBody() ;pb.buildHead() ;pb.buildFoot() ;return pb.buildPerson() ;}}/* Builder  */
interface PersonBuilder{void buildHead() ;void buildBody() ;void buildFoot() ;Person buildPerson() ;
}
/* ConcreteBuilder */
class  ManBuilder implements PersonBuilder{Person person ;public ManBuilder(){person  = new Person() ;}public void buildHead() {person.setHead("创建男人的头");}public void buildBody() {person.setBody("创建男人的身体") ;}public void buildFoot() {person.setFoot("创建男人的脚") ;}public Person buildPerson() {return person;}}/*product  表示被构造的复杂对象*/
class Person{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 class Main {public static void main(String args[]){PersonDirector pd = new PersonDirector() ;Person person = pd.constructPerson(new ManBuilder()) ;System.out.println(person.getBody()); System.out.println(person.getFoot());System.out.println(person.getHead());}}

运行结果:

 

创建男人的身体
创建男人的脚
创建男人的头

3. 个人编写案例

package org.demo.builder;/*** * Function : 建造者设计模式*  将对象复杂的构造过程和最终的表示相分离   使得同样的构造过程可以创建不同的表示* @author : Liaokailin* CreateDate : 2014-6-20* version : 1.0*/
public class BuilderFoo {public static void main(String[] args) {System.out.println(" 经销商给客户进行的汽车保养(汽车在三包期内)费用应该由汽车厂承担  故经销商通过系统向车厂申请索赔  ==>创建索赔单");BuilderOrder createOrder = new CreateClaimOrderFromJSP() ;ClaimOrder claimOrder = new ClaimOrderOtbainDirector(createOrder).obtainClaimOrder() ;System.out.println("向数据库保存索赔单信息  经销商新增索赔单成功. 索赔单信息为:");System.out.println("\t\t"+claimOrder.toString());System.out.println("--------------经销商提交索赔单以后 车厂需要审核索赔单 ,点击审核以后需要去查询索赔单信息---------------");createOrder = new ViewClaimOrderFromDB() ;claimOrder = new ClaimOrderOtbainDirector(createOrder).obtainClaimOrder() ;System.out.println("查询索赔单详情:\n"+claimOrder.toString());}}/*** 需要构建的对象  ==>汽车4S店 (经销商) 向汽车厂索赔申请的索赔单*/class ClaimOrder{String baseInfo  ; //基本信息 String partsInfo ; //配件信息String claimPrice ; //索赔金额String attachInfo ; //附件信息
     @Overridepublic String toString() {return "ClaimOrder [baseInfo=" + baseInfo + ", partsInfo=" + partsInfo+ ", claimPrice=" + claimPrice + ", attachInfo=" + attachInfo+ "]";}public String getBaseInfo() {return baseInfo;}public void setBaseInfo(String baseInfo) {this.baseInfo = baseInfo;}public String getPartsInfo() {return partsInfo;}public void setPartsInfo(String partsInfo) {this.partsInfo = partsInfo;}public String getClaimPrice() {return claimPrice;}public void setClaimPrice(String claimPrice) {this.claimPrice = claimPrice;}public String getAttachInfo() {return attachInfo;}public void setAttachInfo(String attachInfo) {this.attachInfo = attachInfo;}}/*** * 创建一个索赔订单的过程*/
interface BuilderOrder {void baseInfo()  ; //基本信息 void partsInfo() ; //配件信息void claimPrice() ; //索赔金额void attachInfo() ; // 附件信息ClaimOrder obtainClaimOrder() ;  //创建索赔单
}/*** * 从jsp页面获取信息 新增的方式创建索赔单*/
class CreateClaimOrderFromJSP implements BuilderOrder{ClaimOrder claimOrder ;public CreateClaimOrderFromJSP() {claimOrder = new ClaimOrder() ;}@Overridepublic void baseInfo() {System.out.println("\t从jsp页面获取baseinfo");claimOrder.setBaseInfo("baseInfo") ;}@Overridepublic void partsInfo() {System.out.println("\t从jsp页面获取配件信息");claimOrder.setPartsInfo("partsInfo") ;}@Overridepublic void claimPrice() {System.out.println("\t从jsp页面获取索赔总金额.");claimOrder.setClaimPrice("总金额:10000") ;} @Overridepublic void attachInfo() {System.out.println("\t上传附件到文件服务器,然后将文件id返回");claimOrder.setAttachInfo("附件IDS.") ;}@Overridepublic ClaimOrder obtainClaimOrder() {return claimOrder;}}//  例外的实现一个   class Xxx implements BuilderOrder   可以自由获得一个新的索赔单的处理过程    例如 点击页面上的  【索赔单详情】 是需要从数据库检索信息
/*** 从数据库来查询索赔单信息*/
class ViewClaimOrderFromDB implements BuilderOrder{ClaimOrder claimOrder ;public ViewClaimOrderFromDB() {claimOrder = new ClaimOrder() ;}@Overridepublic void baseInfo() {System.out.println("\t从数据库获取baseinfo");claimOrder.setBaseInfo("baseInfo from db") ;}@Overridepublic void partsInfo() {System.out.println("\t从数据库获取配件信息");claimOrder.setPartsInfo("partsInfo from db ") ;}@Overridepublic void claimPrice() {System.out.println("\t从数据库获取索赔总金额.");claimOrder.setClaimPrice("总金额:10000  from db ") ;} @Overridepublic void attachInfo() {System.out.println("\t从数据库将文件id返回");claimOrder.setAttachInfo("附件IDS FROM DB  ") ;}@Overridepublic ClaimOrder obtainClaimOrder() {return claimOrder;}
}/*** 创建索赔单.  构造过程都是一样的  只要BuilderOrder的方式不同 最后获得的信息是不一样的*/
class ClaimOrderOtbainDirector{private BuilderOrder cbo  ;public ClaimOrderOtbainDirector(BuilderOrder cbo) {this.cbo = cbo ;}public ClaimOrder obtainClaimOrder(){//先处理基础信息
        cbo.baseInfo() ;cbo.partsInfo() ;cbo.claimPrice() ;cbo.attachInfo() ;return cbo.obtainClaimOrder() ;}
}

执行的结果:

  

 经销商给客户进行的汽车保养(汽车在三包期内)费用应该由汽车厂承担  故经销商通过系统向车厂申请索赔  ==>创建索赔单从jsp页面获取baseinfo从jsp页面获取配件信息从jsp页面获取索赔总金额.上传附件到文件服务器,然后将文件id返回
向数据库保存索赔单信息  经销商新增索赔单成功. 索赔单信息为:ClaimOrder [baseInfo=baseInfo, partsInfo=partsInfo, claimPrice=总金额:10000, attachInfo=附件IDS.]
--------------经销商提交索赔单以后 车厂需要审核索赔单 ,点击审核以后需要去查询索赔单信息---------------从数据库获取baseinfo从数据库获取配件信息从数据库获取索赔总金额.从数据库将文件id返回
查询索赔单详情:
ClaimOrder [baseInfo=baseInfo from db, partsInfo=partsInfo from db , claimPrice=总金额:10000  from db , attachInfo=附件IDS FROM DB  ]

转载于:https://www.cnblogs.com/liaokailin/p/3799547.html

设计模式05-建造者模式相关推荐

  1. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  2. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  3. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  4. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  5. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

  6. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  7. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

  8. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  9. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  10. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

最新文章

  1. mybatis delete返回值_从零开始学习在IntelliJ IDEA 中使用mybatis
  2. CNN中,1X1卷积核到底有什么作用呢?
  3. DataGridView中获取与设置当前选中行以及SelectedRows和CurrentRow注意区分
  4. halcon/c++接口基础 之异常处理
  5. Java SimpleTimeZone equals()方法与示例
  6. A Simple Job
  7. 双系统windows10扩容ubuntu16.04
  8. 小米11新旗舰通过3C认证:支持最高67.1W快充
  9. 轻松做性能测试,月入3万的主流测试工具大揭秘
  10. DataRow 点不出 Select
  11. 网站自动适配技术实现原理
  12. 智慧城管监控指挥中心建设
  13. c 语言可以直接调用max,c语言宏定义函数如何调用
  14. java写关于温度的算法_摄氏温度和华氏温度的转换之java算法
  15. CenterNet( Keypoint Triplets for Object Detection) 学习笔记
  16. 良心安利秋分海报设计模板素材
  17. 【微信小程序】创建自己的小程序
  18. 利用Sharepoint里面Mysite的Shared Pictures的图片做相册 [包括创建文件夹,上传文件]...
  19. 地图导航中的路径规划算法(综述)
  20. Dubbo/Dubbox的服务暴露(一)

热门文章

  1. c++ map 析构函数_C++学习刷题6--C++类的使用:构造函数、析构函数和类的使用
  2. python怎么打印列表长度_关于python:生成器输出的长度
  3. linux mint 17.3 内核,LinuxMint 17.3 Cinnamon抢鲜评测
  4. html行间距1.8em,雅黑字体下WordPress 行高与字符间距最佳实践:1.8em与0.06em
  5. python unicodeencodeerror_解决 Python UnicodeEncodeError 错误
  6. linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
  7. 实现断网收银_便利店收银系统,可以实现简单又好用!
  8. vb6 数据自动生成excel文件_Excel随机生成数据
  9. Python进阶5——切片
  10. 记录一下mathtype输入任意形式矩阵