java开发建造者模式验证实例详解
目录
- 引言
- 经典再现
- 建造者模式优点及应用场景
- 工厂方法模式和建造者模式区别
- 拓展与总结
引言 创建一个类的实例,我们通常使用类中构造函数来完成对象的初始化,如果一个对象构造过程很复杂,如果将构造过程和对象使用的过程放在一起,就显得这个类很笨重,职责也不单一,最好的解决办法就是将构造过程拿出来单独进行封装,类的使用单独封装一个类就会好很多。如:mybaits中的SqlSessionFactoryBulider和SqlSessionFactory两个类,下图为SqlSessionFactoryBulider和SqlSessionFactory两个类提供的方法。前者职责是根据mybaits的配置文件(配置文件很复杂,构造过程更复杂)构造SqlSessionFactory实例对象,后者职责是SqlSessionFactory专注于的各种情况的下SqlSession的生成。
文章图片
文章图片
经典再现 建造者模式将对象的创建和对象的表示分开,使用同样的建造过程可以建造出不同的对象表示,一下我们使用计算机的生产过程为例,介绍建造者模式。计算机可以用来上网、办公、娱乐等这个是计算机这个对象本身要提供给我们的功能(我们可以称为对象表示) 我们称其为computer。其构造包括安装主板、安装CPU、安装硬盘、网卡等构造过程,我们称之为bulider,假设联想计算机和dell计算机具体的安装方法上有差别,因此我们有LenovoBulider和DellBulider两个具体的实现类,这个两个类及bulider更关注具体的建造方法,我们再封装一个类,调用这些建造方法完成完成产品的构建,就产生了我们经典的建造者模式。上例类图如下:
文章图片
产品Computer 示例代码如下:
public class Computer {private String hardDisk ; private String CPU; private String mainboard ; public void setHardDisk(String hardDisk) {this.hardDisk = hardDisk; }public void setCPU(String CPU) {this.CPU = CPU; }public void setMainboard(String mainboard) {this.mainboard = mainboard; }public void start(){System.out.println(hardDisk+""+CPU+""+ mainboard +"办公"); }public void work(){System.out.println(hardDisk+""+CPU+""+ mainboard +"办公"); }public void play(){System.out.println(hardDisk+""+CPU+""+ mainboard +"娱乐"); }}
抽象的建造者,把可变部分延迟到子类进行
public abstract class ComputerBulider {protected Computer acomputer = new Computer(); public abstract void buildCPU(); public abstract void buildHardDisk(); public abstract void buildMainboard(); //关键代码需要返回一个产品的对象public Computer getComputer(){return acomputer; }}
两个具体的建造者,完成那些不同建造方法的具体实现,代码如下
public class DellBulider extends ComputerBulider {@Overridepublic void buildCPU() {acomputer.setCPU("dell CPU"); }@Overridepublic void buildHardDisk() {acomputer.setHardDisk("dell 硬盘"); }@Overridepublic void buildMainboard() {acomputer.setMainboard("dell 主板"); }}public class LenovoBulider extends ComputerBulider {@Overridepublic void buildCPU() {acomputer.setCPU("联想 CPU"); }@Overridepublic void buildHardDisk() {acomputer.setHardDisk("联想 硬盘"); }@Overridepublic void buildMainboard() {acomputer.setMainboard("联想 主板"); }}
指挥者,总体包装师代码如下:
//指挥者,接收指令安排建造者根据一定的工序去制作产品public class Director {private ComputerBulider computerBuilder; public Director(ComputerBulider comBuilder) {this.computerBuilder = comBuilder; }public Computer construct(){//安装主板computerBuilder.buildMainboard(); //安装cpucomputerBuilder.buildCPU(); //安装硬盘computerBuilder.buildHardDisk(); //准备完毕,返回一个完整的计算机给调用者return computerBuilder.getComputer(); }}
巧妙之处,在于通过构造注入的方式,将具体的建造者对象传入,按照流程化方式建造了一个完整的对象。
通过代码我们可以想象如果要生产一台华硕计算机,我们只需要扩展一个华硕的具体bulider即可,原有的代码完全不用动,符合开闭原则。另外我们指挥者类中只出现抽象的bulider,具体bulider完全可以替换它,符合里氏替换原则。当然每个类各司其职,职责清晰,满足单一职责原则。
建造者模式优点及应用场景 优点:客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;每一个具体建造者都相对独立,而与其他的具体建造者无关;可以更加精细地控制产品的创建过程。
应用场景:建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式
工厂方法模式和建造者模式区别 工厂方法模式输出的是产品;而建造者模式中的builder输出的是一个个零部件,再由指挥者进行包装形成产品。建造者模式更加关注与零件装配的顺序
拓展与总结 只要符合将对象的创建和对象的表示分离,就属于建造者模式。建造者模式在实际使用中有很多变种,如JDK中StringBulider及mybatis中SqlSessionFactoryBulider,就没有指挥者,但是也隶属于建造模式,在使用过程中需要我们根据概念活学活用。在实际开发中,建造者模式又经常和工厂模式结合使用。
【java开发建造者模式验证实例详解】以上就是java开发建造者模式验证实例详解的详细内容,更多关于java建造者模式验证的资料请关注脚本之家其它相关文章!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 深入理解Go之generate
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)