建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。初次听上去和模板方法模式有点类似。
模板方法模式(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
看上去,它们都是将稳定顺序的方法抽象到父类中,我理解模板方法模式重点在于执行一系列方法,形成一个复杂的算法。而建造者模式重点在于获得一个由多个复杂组件组成的产品。
建造者模式的好处就是使得建造代码与标识代码分离,由于创建者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
UML
Builder是为了创建一个Product对象的各个部件指定的抽象接口,ConcreteBuilder是具体的建造者,实现了Builder接口,构造和装配各个部件。Director是指挥者,构建一个使用Builder接口的对象。
举例
组装电脑主机的过程中,几个主要部件的安装顺序:组装CPU,组装主板,组装显卡,组装硬盘等,而PC不同的使用需求,各个部件的配置要求也不尽相同,下面用通过建造者模式,实现不同要求的电脑组装。
电脑类:
public class Computer {
private String CPU;
private String mainBoard;
private String videoCard;
private String hardDisk;
//省略get,set方法...
public void show(){
System.out.println("本机配置:"+CPU+";"+mainBoard+";"+videoCard+";"+hardDisk+"");
}
}
电脑建造者抽象类,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建
public abstract class ComputerBuilder {
public abstract void assembledCPU(); //组装CPU
public abstract void assembledMainBoard(); //组装主板
public abstract void assembledVideoCard(); //组装显卡
public abstract void assembledHardDisk(); //组装硬盘
public abstract Computer getComputer(); //获取电脑
}
游戏用电脑建造者,实现上述抽象类,并在建造完成后,提供产品实例
public class GamePCBuilder extends ComputerBuilder{
private Computer computer = new Computer();
@Override
public void assembledCPU() {
computer.setCPU("Intel i7");
}
@Override
public void assembledMainBoard() {
computer.setMainBoard("华硕XXXX");
}
@Override
public void assembledVideoCard() {
computer.setVideoCard("GTX1080");
}
@Override
public void assembledHardDisk() {
computer.setHardDisk("256G SSD");
}
@Override
public Computer getComputer() {
return this.computer;
}
}
影音娱乐用电脑建造者
public class MoviePCBuilder extends ComputerBuilder {
private Computer computer = new Computer();
@Override
public void assembledCPU() {
computer.setCPU("Intel i5");
}
@Override
public void assembledMainBoard() {
computer.setCPU("技嘉XXXX");
}
@Override
public void assembledVideoCard() {
computer.setVideoCard("GTX970");
}
@Override
public void assembledHardDisk() {
computer.setHardDisk("西数1T");
}
@Override
public Computer getComputer() {
return this.computer;
}
}
指挥者,调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
public class Director {
public Computer assembledComputer(ComputerBuilder computerBuilder){
computerBuilder.assembledCPU();
computerBuilder.assembledMainBoard();
computerBuilder.assembledVideoCard();
computerBuilder.assembledHardDisk();
return computerBuilder.getComputer();
}
}
调用
通过指挥者以及具体的建造者实例来获取想要的电脑,并执行电脑的相关方法
public static void main(String[] args){
Director director = new Director();
GamePCBuilder gamePCBuilder = new GamePCBuilder();
Computer computer = director.assembledComputer(gamePCBuilder);
computer.show();
}
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。