热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java设计模式之建造者模式(BuilderPattern)

目的:将产品与产品的创建过程解耦。他是按照相应的步骤来构建产品下面看一下UML序列图对于序列图的一个解释下面来上一个标准代码Product.javapackage

目的:将产品与产品的创建过程解耦  。他是按照相应的步骤来构建产品

下面看一下UML序列图 

 

 对于序列图的一个解释

 下面来上一个标准代码

Product.java

package com.pxx;public class Product {private String shape;private int height;private String color;public Product(String shape, int height, String color) {this.shape = shape;this.height = height;this.color = color;}public String getShape() {return shape;}public void setShape(String shape) {this.shape = shape;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "com.pxx.Product{" +"shape='" + shape + '\'' +", , color='" + color + '\'' +'}';}}

 建造者的抽象类或者接口

ProductBuilder.java

package com.pxx;public interface ProductBuilder {//定义好产品相关的各种操作void buildShape();void buildHeight();void buildColor();Product buildProduct();
}

下面是具体的构建者对象

AoliaoConcreteBuilder.java

package com.pxx;public class AoliaoConcreteBuilder implements ProductBuilder {//这里面必须聚合一个产品类Product product;//这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品//传进来之后再来构建相关参数public AoliaoConcreteBuilder(String shape,int height,String color) {//这里就已经赋值了this.product = new Product(shape,height,color);}@Overridepublic void buildShape() {System.out.println("奥利奥形状:" +product.getShape());}@Overridepublic void buildHeight() {System.out.println("奥利奥高度:" + product.getHeight() + "厘米");}@Overridepublic void buildColor() {System.out.println("奥利奥颜色:" + product.getColor());}//返回这个对象public Product buildProduct() {return product;}
}

Director.java

package com.pxx;public class Director {//这里面我们需要调用ProductBuilder里面所有方法(这个是所有建造者的父类,也就是说,只要实现它的建造者都能传进来)//并且最后给我们返回一个对象//注意这个对象不是直接给我们运行//相当于是一个分发的结果private ProductBuilder productBuilder;//这里可以直接传入比如Aoliao这个对象,因为是实现ProductBuilderpublic Director(ProductBuilder productBuilder) {this.productBuilder = productBuilder;}public Product constructProduct() {productBuilder.buildShape();productBuilder.buildHeight();productBuilder.buildColor();return productBuilder.buildProduct();}
}

看一下客户端Client.java

package com.pxx;public class Client {public static void main(String[] args) {//有一个奥利奥的具体构建者对象AoliaoConcreteBuilder aoliao = new AoliaoConcreteBuilder("圆形",2,"蓝色");//利用Director来调用具体的构建者Director director = new Director(aoliao);//要调用这个对象的方法Product p = director.constructProduct();//这里就开始构建System.out.println(p);}
}

运行结果

上面就是标准建造者模式一个表示 。

上面代码还是要进行一个重构,这里我们这里是可以采用链式编程

我们需要反复拿这个建造者对象一直调用吗? 不需要,调用一下,然后返回当前调用者对象就可以了。

代码重构

ProductBuilder.java

package com.pxx;public interface ProductBuilder {//定义好产品相关的各种操作AoliaoConcreteBuilder buildShape();AoliaoConcreteBuilder buildHeight();AoliaoConcreteBuilder buildColor();Product buildProduct();
}

AoliaoConcreteBuilder.java

package com.pxx;public class AoliaoConcreteBuilder implements ProductBuilder {//这里面必须聚合一个产品类Product product;//这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品//传进来之后再来构建相关参数public AoliaoConcreteBuilder(String shape,int height,String color) {//这里就已经赋值了this.product = new Product(shape,height,color);}@Overridepublic AoliaoConcreteBuilder buildShape() {System.out.println("奥利奥形状:" +product.getShape());return this;}@Overridepublic AoliaoConcreteBuilder buildHeight() {System.out.println("奥利奥高度:" + product.getHeight() + "厘米");return this;}@Overridepublic AoliaoConcreteBuilder buildColor() {System.out.println("奥利奥颜色:" + product.getColor());return this;}//返回这个对象public Product buildProduct() {return product;}
}

Director.java

运行结果

其实,说一下,有时候这个建造者模式组件表现的不会那么齐全,比如我们稍微去看一下StringBuilder的源码

看到这个StringBuilder后面有个Builder就应该猜出来,它是一个建造者或者建造者的抽象层

我们可以看到StringBuilder继承了一个AbstractStringBuilder类,这个就像是具体的建造者对象去实现了建造者抽象

再去看一下AbstractStringBuilder类

那么一看这个类就是一个抽象类,这是不是就让我们想起建造者抽象,但是它还不是,我们继续往下追。

这里面就有我们常用的append抽象方法

这个就可以理解为建造者抽象,产品的话可以考虑为没有。

 而且这个里面方法都是链式编程

这个this就是一个StringBuilder的一个具体的对象。 

 好了,这个建造者模式先说到这。

 


推荐阅读
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 开发笔记:里氏替换原则
    本文由编程笔记#小编为大家整理,主要介绍了里氏替换原则相关的知识,希望对你有一定的参考价值。1.定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2, ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 第四单元和课程总结:简单的架构设计意识
    一、第四单元架构设计总结第一次作业由于需要按名查找类图模型,于是建立"Class"类进行管理由于方法具有参数导致类中存在二级结构 ... [详细]
author-avatar
手机用户2502906803
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有