设计模式【4】------>建造者模式
一、什么是建造者模式
- 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的方式进行创建。
- 工厂类模式是提供的是创建单个类的产品
- 而建造者模式则是将各种产品集中起来进行管理,用来具有不同的属性的产品
建造者模式通常包括下面几个角色:
- Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
- ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
- Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
- Product:要创建的复杂对象。
结构图:
二、建造者模式的使用场景
使用场景:
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
- 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
- JAVA 中的 StringBuilder就是建造者模式创建的,他把一个单个字符的char数组组合起来
- String不是建造者模式,它提供的操作应该是对于字符串本身的一些操作,而不是创建或改变一个字符串。
代码案例
1、电脑角色:包含多个组成部件的复杂对象。
/** * 电脑角色:包含多个组成部件的复杂对象。 */ public class Computer { /** * 主机 */ private String host; /** * 显示器 */ private String monitor; /** * 键盘 */ private String keyboard; public void setHost(String host) { this.host = host; } public void setMonitor(String monitor) { this.monitor = monitor; } public void setKeyboard(String keyboard) { this.keyboard = keyboard; } public void show(){ System.out.println("电脑组装成功..."); } }
2、抽象建造者:包含创建电脑各个子部件的抽象方法。
/** * 抽象建造者:包含创建电脑各个子部件的抽象方法。 */ abstract class Builder { //创建产品对象 protected Computer computer = new Computer(); public abstract void buildHost(); public abstract void buildMonitor(); public abstract void buildKeyBoard(); //返回产品对象 public Computer getResult() { return computer; } }
3、具体建造者:实现了抽象建造者接口。
/** * 具体建造者:实现了抽象建造者接口。 */ public class ConcreteBuilder extends Builder { @Override public void buildHost() { System.out.println("建造主机..."); computer.setHost("建造主机"); } @Override public void buildMonitor() { System.out.println("建造显示器..."); computer.setMonitor("建造显示器"); } @Override public void buildKeyBoard() { System.out.println("建造键盘中..."); computer.setKeyboard("建造键盘"); } }
4、指挥者:调用建造者中的方法完成复杂对象的创建。
/** * 指挥者:调用建造者中的方法完成复杂对象的创建。 */ public class Director { private Builder builder; public Director(Builder builder){ this.builder=builder; } //电脑构建与组装方法 public Computer construct(){ builder.buildHost(); builder.buildMonitor(); builder.buildKeyBoard(); return builder.getResult(); } }
5、客户类。
/** * 客户类 */ public class Client { public static void main(String[] args){ Builder builder = new ConcreteBuilder(); Director director = new Director(builder); Computer construct = director.construct(); construct.show(); } }
打印结果
三、优缺点
主要优点如下:
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
其缺点如下:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。