使用场景
我们需要构建一个复杂的产品。比如:电脑,手机,飞船。这个复杂产品的创建,有这样一个问题需要处理:装配子组件是不是需要特定的步骤?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时,我们就可能需要想到建造者模式。
建造者模式的本质
建造者模式又称生成器模式,建造者模式分离了对象子组件的单独构造(由builder来负责)和装配(由director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构造过程比较复杂的时候。
由于实现了构建和装配的解耦,不同的构造器,相同的装配可以做出不同的对象;相同的构造器,不同的装配也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
创建者模式的优点:将一个复对象的创建过程封装起来。允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同)。向客户隐藏产品内部的实现。产品的实现可以被替换,因为客户只看到一个抽象的接口。
建造者模式demo
我们需要一台台式机,这台台式机由显示器、主机、鼠标、键盘组成。具体代码如下:
public class Computer {
//显示器
private Monitor monitor;
//主机
private Host host;
//键盘
private Keyboard keyboard;
//鼠标
private Mouse mouse;
public void open(){
System.out.println("打开电脑!");
}
public Monitor getMonitor() {
return monitor;
}
public void setMonitor(Monitor monitor) {
this.monitor = monitor;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
public Keyboard getKeyboard() {
return keyboard;
}
public void setKeyboard(Keyboard keyboard) {
this.keyboard = keyboard;
}
public Mouse getMouse() {
return mouse;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
}
public class Monitor {
private String name;
public Monitor(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Host {
private String name;
public Host(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Keyboard {
private String name;
public Keyboard(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Mouse {
private String name;
public Mouse(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface ComputerBuilder {
Monitor buildMonitor();
Keyboard buildKeyboard();
Host buildHost();
Mouse buildMouse();
}
public class TestComputerBuilder implements ComputerBuilder {
@Override
public Monitor buildMonitor() {
System.out.println("构建显示器");
return new Monitor("显示器");
}
@Override
public Host buildHost() {
System.out.println("构建主机");
return new Host("主机");
}
@Override
public Keyboard buildKeyboard() {
System.out.println("构建键盘");
return new Keyboard("键盘");
}
@Override
public Mouse buildMouse() {
System.out.println("构建鼠标");
return new Mouse("鼠标");
}
}
public interface ComputerDirector {
/**
* 组装电脑
* @return
*/
Computer dircetComputer();
}
public class TestComputerDirector implements ComputerDirector {
private ComputerBuilder computerBuilder;
public TestComputerDirector(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
@Override
public Computer dircetComputer() {
Monitor monitor = computerBuilder.buildMonitor();
Keyboard keyboard = computerBuilder.buildKeyboard();
Host host = computerBuilder.buildHost();
Mouse mouse = computerBuilder.buildMouse();
//装配成台式机
Computer computer = new Computer();
computer.setHost(host);
computer.setKeyboard(keyboard);
computer.setMonitor(monitor);
computer.setMouse(mouse);
return computer;
}
}
public class Client {
public static void main(String[] args) {
ComputerDirector director = new TestComputerDirector(new TestComputerBuilder());
Computer c = director.dircetComputer();
System.out.println(c.getKeyboard());
c.open();
}
}
运行结果如下:
类图
这里将Keyboard、Host、Monitor、Mouse四个类省略了,不然生成的类图十分庞大。
开发中的应用场景
StringBuilder类的append方法
SQL中的preparedSataement
JDOM中的DomBuilder,SAXBuilder
(以Builder结尾的类大多都应用了构建者模式)
以上为建造者模式的学习笔记,此文章为尚学堂视频的学习笔记+自己总结。参考资料:Head First 设计模式。