定义
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
UML图描述
建造者模式主要包含四种角***r>1.指挥者角色:负责将建造者的行为组合到一起,为下图中的ComputerDirector。
2.抽象建造者角色:是所有具体建造者的抽象父类,为下图中的AbstractComputerBuilder。
3.具体建造者角色:负责完成建造产品的每个具体行为,为下图中的AsusComputerBuilder和DellComputerBuilder。
4.具体产品角色:是建造者负责建造的具体产品,为下图中的Computer。

代码实现
/**
* 抽象电脑建造者
*/
public abstract class AbstractComputerBuilder {
protected Computer computer;
//组装CPU
public abstract void buildCpu();
//组装主板
public abstract void buildMainBoard();
//组装显卡
public abstract void buildGraphicsCard();
//组装内存
public abstract void buildMemory();
//组装硬盘
public abstract void buildHardDisk();
//获取计算机
public Computer getComputerItem(){
return computer;
}
}
/**
* 华硕电脑建造者
*/
public class AsusComputerBuilder extends AbstractComputerBuilder{
public AsusComputerBuilder(){
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Intel 酷睿i7 9代");
}
@Override
public void buildMainBoard() {
computer.setMainBoard("华硕TUF B360M-PLUS GAMING S");
}
@Override
public void buildGraphicsCard() {
computer.setGraphicsCard("七彩虹iGame GeForce RTX 2060 Ti Advanced OC 全新 NVIDIA Turing");
}
@Override
public void buildMemory() {
computer.setMemory("金士顿骇客神条FURY 8GB DDR4 2400(HX424C15FB/8) 16GB/单条");
}
@Override
public void buildHardDisk() {
computer.setMemory("西部数据1TB 7200转 64MB SATA3 黑盘(WD1003FZEX)");
}
}
/**
* 戴尔电脑制造者
*/
public class DellComputerBuilder extends AbstractComputerBuilder{
public DellComputerBuilder(){
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Intel 酷睿i5 9代");
}
@Override
public void buildMainBoard() {
computer.setMainBoard("戴尔TUF B360M-PLUS GAMING S");
}
@Override
public void buildGraphicsCard() {
computer.setGraphicsCard("七彩虹iGame GeForce RTX 2080 Ti Advanced OC 全新 NVIDIA Turing");
}
@Override
public void buildMemory() {
computer.setMemory("金士顿骇客神条FURY 8GB DDR4 2400(HX424C15FB/8) 8GB/单条");
}
@Override
public void buildHardDisk() {
computer.setMemory("西部数据1TB 7200转 64MB SATA3 黑盘(WD1003FZEX)");
}
}
/**
* 电脑制造指挥者
*/
public class ComputerDirector {
private AbstractComputerBuilder abstractComputerBuilder;
public ComputerDirector(AbstractComputerBuilder abstractComputerBuilder){
this.abstractComputerBuilder = abstractComputerBuilder;
}
public void buildComputer(){
abstractComputerBuilder.buildCpu();
abstractComputerBuilder.buildGraphicsCard();
abstractComputerBuilder.buildMainBoard();
abstractComputerBuilder.buildMemory();
abstractComputerBuilder.buildHardDisk();
}
public Computer getComputer(){
return abstractComputerBuilder.getComputerItem();
}
}
/**
* 电脑实体
*/
public class Computer {
private String cpu;
private String mainBoard;
private String graphicsCard;
private String memory;
private String hardDisk;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getGraphicsCard() {
return graphicsCard;
}
public void setGraphicsCard(String graphicsCard) {
this.graphicsCard = graphicsCard;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", mainBoard='" + mainBoard + '\'' +
", graphicsCard='" + graphicsCard + '\'' +
", memory='" + memory + '\'' +
", hardDisk='" + hardDisk + '\'' +
'}';
}
}/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
//华硕电脑制造者
AbstractComputerBuilder asusComputerBuilder = new AsusComputerBuilder();
//华硕电脑制造指挥者
ComputerDirector asusComputerDirector = new ComputerDirector(asusComputerBuilder);
//组装华硕电脑
asusComputerDirector.buildComputer();
System.out.println(asusComputerBuilder.getComputerItem());
//戴尔电脑制造者
AbstractComputerBuilder dellComputerBuilder = new DellComputerBuilder();
//戴尔电脑制造指挥者
ComputerDirector dellComputerDirector = new ComputerDirector(dellComputerBuilder);
//组装戴尔电脑
dellComputerDirector.buildComputer();
System.out.println(dellComputerBuilder.getComputerItem());
}
}适用场景
1.需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
2.需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
3.对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
4.隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
建造者模式的优点
1.在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2.每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
3.可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4.增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
建造者模式的缺点
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

京公网安备 11010502036488号