设计模式小结-建造者模式(Builder Pattern)
前言:作为一个程序员,哪怕是刚入行的程序员,对于设计模式都会有所认识,那设计模式到底是什么呢?笔者的理解是,每一种设计模式是对于一种重复性工作的解决方式,能够简化工作效率,提高编码能力,当然了,这只是笔者自己对于设计模式的一点点理解。
设计模式遵循六大原则,这个是通用的原则,本文就不作具体的原则介绍了,这里只是简单介绍一下,设计模式遵循的总原则:开闭原则,就是在设计代码的时候,尽量做到,代码能够很好的支持可扩展性,达到"接口"的作用,在实现新功能的时候,不需要去修改之前的代码,只需要实现这个"接口",就能达到目的,便于代码的维护以及功能升级。
设计模式的分类:总的来说,设计模式按照类型来分的话,分为三类:
1. 创建性模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
2. 结构性模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式
3. 行为性模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
本文讲解建造者模式:
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
- 用户只需要给出指定复杂对象的类型和内容;
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
建造者模式能够解决的问题:
- 方便用户创建复杂的对象(不需要知道实现过程)
- 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
建造者模式的构成:
1. Builder: 抽象接口,用来表示产品对象各个组成部分的建造,规定实现了复杂对象中的各个组成部分的构建
2. ProductPartBuilder 实现类: 实现了Builder接口,针对不同的逻辑,具体实例化复杂对象各个部分的创建
3. Director: 调用具体建造者来创建复杂对象的各个组成部分
4. Product: 要创建的复杂对象
应用实例:
java.lang包中的StringBuilder
使用场景:
1. 需要生成的对象具有复杂的内部结构构建
2. 需要生成的对象内部属性本身相互依赖
代码如下:
复杂对象的组成:Product
package com.ctp.ghub.designpattern.builder; /** * Created by Administrator on 2018/7/1 0001. * 复杂对象的组成部分,为了方便演示,里面的组成部分都用String 类型代替 各自的类型了 */ public class ComputerProduct { /** * 鼠标 */ private String mouse; /** * 键盘 */ private String keyBoard; /** * 显示器 */ private String display; public String getMouse() { return mouse; } public void setMouse(String mouse) { this.mouse = mouse; } public String getKeyBoard() { return keyBoard; } public void setKeyBoard(String keyBoard) { this.keyBoard = keyBoard; } public String getDisplay() { return display; } public void setDisplay(String display) { this.display = display; } @Override public String toString() { return "ComputerProduct{" + "mouse='" + mouse + '\'' + ", keyBoard='" + keyBoard + '\'' + ", display='" + display + '\'' + '}'; } }
Builder: 里面定义了复杂对象的各个组成部分
package com.ctp.ghub.designpattern.builder; /** * Created by Administrator on 2018/7/1 0001. */ public interface ComputerProductBuilder { /** * 创建鼠标 */ void buildMouse(); /** * 创建键盘 */ void buildKayBoard(); /** * 创建显示器 */ void buildDisplay(); /** * 获取完整产品 * @return */ ComputerProduct getComputerProduct(); }
AcerComputerBuilder实现
package com.ctp.ghub.designpattern.builder; /** * Created by Administrator on 2018/7/1 0001. */ public class ComputerDirector { public ComputerProduct produceComputerProduct(ComputerProductBuilder computerProductBuilder){ computerProductBuilder.buildDisplay(); computerProductBuilder.buildKayBoard(); computerProductBuilder.buildMouse(); return computerProductBuilder.getComputerProduct(); } }了抽象接口Builder,针对不同的逻辑,具体实现复杂对象Product的实例化,建造完成,提供完整的产品
package com.ctp.ghub.designpattern.builder; /** * Created by Administrator on 2018/7/1 0001. */ public class AcerComputerBuilder implements ComputerProductBuilder{ ComputerProduct computerProduct = null; /** * 通过构造函数创建一个ComputerProduct 复杂对象 */ public AcerComputerBuilder() { computerProduct = new ComputerProduct(); } @Override public void buildMouse() { computerProduct.setMouse("Acer 牌鼠标"); } @Override public void buildKayBoard() { computerProduct.setKeyBoard("Acer 牌键盘"); } @Override public void buildDisplay() { computerProduct.setDisplay("Acer 牌显示器"); } /** * 提供完整的产品方法 * @return */ @Override public ComputerProduct getComputerProduct(){ return computerProduct; } }
Director: 指挥者,调用复杂对象的各个组成部分创建
package com.ctp.ghub.designpattern.builder; /** * Created by Administrator on 2018/7/1 0001. */ public class ComputerDirector { public ComputerProduct produceComputerProduct(ComputerProductBuilder computerProductBuilder){ computerProductBuilder.buildDisplay(); computerProductBuilder.buildKayBoard(); computerProductBuilder.buildMouse(); return computerProductBuilder.getComputerProduct(); } }
测试:
现在回过头来,看看建造者模式在java中的应用
jdk中StringBuilder和StringBuffer的append()方法使用到了建造者模式
StringBuilder把构建者的任务交给了父类AbstractStringBuilder
return this; 返回构建对象