设计模式之建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示
使用建造者模式,客户端只需要指定需要建造的类型就可以得到它们,而无需关注建造的过程和细节。
建造者模式的主要组成为:
Builder类
为了创建product的各个部件的抽象接口
具体建造类
实现了Builder接口,实现了具体构件的创建。
指挥者Director
构件一个使用builder接口的对象
product
具体建造的产品
具体实现如下
Product
此处的具体产品就是电脑。
package builder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by canon on 2018/11/29.
*/
public class Computer {
private List<String> parts = new ArrayList<>();
public void install(String part) {
parts.add(part);
}
public void display() {
for (String part : parts) {
System.out.println(part);
}
}
}
抽象建造者
package builder;
/**
* Created by canon on 2018/11/29.
*/
public interface ComputerBuilder {
void installCpu();
void installGraphicsCard();
void installKeyboard();
void installMonitor();
void installHardDisk();
Computer getComputer();
}
具体建造者
戴尔电脑建造者
package builder;
/**
* Created by canon on 2018/11/29.
*/
public class DellComputerBuilder implements ComputerBuilder{
Computer computer = new Computer();
@Override
public void installCpu() {
computer.install("i7因特尔cpu");
}
@Override
public void installGraphicsCard() {
computer.install("GT-1050i显卡");
}
@Override
public void installKeyboard() {
computer.install("戴尔电脑键盘");
}
@Override
public void installMonitor() {
computer.install("戴尔电脑显示器");
}
@Override
public void installHardDisk() {
computer.install("戴尔硬盘");
}
@Override
public Computer getComputer() {
return computer;
}
}
thinkPad电脑建造者
package builder;
/**
* Created by canon on 2018/11/29.
*/
public class ThinkPadComputerBuilder implements ComputerBuilder {
Computer computer = new Computer();
@Override
public void installCpu() {
computer.install("i5因特尔cpu");
}
@Override
public void installGraphicsCard() {
computer.install("GT-1060显卡");
}
@Override
public void installKeyboard() {
computer.install("thinkPad键盘");
}
@Override
public void installMonitor() {
computer.install("thinkPad显示器");
}
@Override
public void installHardDisk() {
computer.install("thinkPad硬盘");
}
@Override
public Computer getComputer() {
return computer;
}
}
指挥者
package builder;
/**
* Created by canon on 2018/11/29.
*/
public class ComputerDirector {
public void productComputer(ComputerBuilder computerBuilder){
computerBuilder.installCpu();
computerBuilder.installGraphicsCard();
computerBuilder.installHardDisk();
computerBuilder.installKeyboard();
computerBuilder.installMonitor();
}
}
客户端
package controller;
import builder.Computer;
import builder.ComputerDirector;
import builder.DellComputerBuilder;
import builder.ThinkPadComputerBuilder;
/**
* Created by canon on 2018/11/29.
*/
public class BuilderDesignPattern {
public static void main(String[] args) {
ComputerDirector computerDirector = new ComputerDirector();
DellComputerBuilder dellComputerBuilder = new DellComputerBuilder();
computerDirector.productComputer(dellComputerBuilder);
Computer dellComputer = dellComputerBuilder.getComputer();
dellComputer.display();
System.out.println("------------------------------------------");
ThinkPadComputerBuilder thinkPadComputerBuilder = new ThinkPadComputerBuilder();
computerDirector.productComputer(thinkPadComputerBuilder);
Computer thinkPadComputer = thinkPadComputerBuilder.getComputer();
thinkPadComputer.display();
System.out.println("------------------------------------------");
}
}
客户端输出
i7因特尔cpu
GT-1050i显卡
戴尔硬盘
戴尔电脑键盘
戴尔电脑显示器
------------------------------------------
i5因特尔cpu
GT-1060显卡
thinkPad硬盘
thinkPad键盘
thinkPad显示器
------------------------------------------
Process finished with exit code 0
建造者模式主要用于一些复杂的对象的创建,这些对象内部建造的顺序通常是稳定的,但是对象的内部的构建通常面临着复杂的变化。使用建造者模式使得构造代码与表示代码解耦,建造者隐藏了创建的种种细节,如果需要改变一个产品内部表示,只需要再定义一个具体的建造者就可以了,易于拓展,符合开闭原则。如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,增加系统的复杂性。