前言
建造者(Builder)模式,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道了。
建造者模式的四个角色
1)Product(产品角色):一个具体的产品对象。【提供产品属性以及set、get方法】
2)Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。【定义成品需要的材料】
3)ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。【提供构建产品的具体材料】
4)Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
【提供构建产品的顺序(封装过程)】
例如 生产一台电脑所需要的硬件有主板、CPU、显卡、内存条等等 ,不同品牌都是需要这些硬件集成,例如没有主板电脑是用不了的,只是型号规格出厂商不一致,但总的属性是一样的
1. 产品角色
@Data
public class Computer {
//cpu
private String cpu;
//主板
private String board;
//显卡
private String card;
//风扇
private String fan;
//内存
private String memory;
}
2. 抽象建造者
public abstract class ComputerBuilder {
private Computer computer = new Computer();
/**
* 构建CPU
*/
public abstract void buildCpu();
/**
* 构建主板
*/
public abstract void buildBoard();
/**
* 构建显卡
*/
public abstract void buildCard();
/**
* 构建风扇
*/
public abstract void buildFan();
/**
* 构建内存
*/
public abstract void buildMemory();
/**
* 当各环节构建完成后就可以出厂了
*/
public Computer buildComputer(){
return computer;
}
}
3. 具体建造者(戴尔电脑)
public class ConcreteDellBuilder extends ComputerBuilder{
@Override
public void buildCpu() {
System.out.println("构建戴尔CPU");
}
@Override
public void buildBoard() {
System.out.println("构建戴尔主板");
}
@Override
public void buildCard() {
System.out.println("构建戴尔显卡");
}
@Override
public void buildFan() {
System.out.println("构建戴尔风扇");
}
@Override
public void buildMemory() {
System.out.println("构建戴尔内存");
}
}
4. 具体建造者(MAC)
public class ConcreteMacBuilder extends ComputerBuilder{
@Override
public void buildCpu() {
System.out.println("构建MAC CPU");
}
@Override
public void buildBoard() {
System.out.println("构建MAC 主板");
}
@Override
public void buildCard() {
System.out.println("构建MAC 显卡");
}
@Override
public void buildFan() {
System.out.println("构建MAC 风扇");
}
@Override
public void buildMemory() {
System.out.println("构建MAC 内存");
}
}
5. 指挥者
@AllArgsConstructor
@Setter
public class ComputerDirector {
private ComputerBuilder computerBuilder;
/**
* 以怎样的顺序构建ComputerBuilder,交给指挥者方法
* 动态指定构建流程
*/
public Computer computerConductor(){
computerBuilder.buildBoard();
computerBuilder.buildCard();
computerBuilder.buildCpu();
computerBuilder.buildFan();
computerBuilder.buildMemory();
return computerBuilder.buildComputer();
}
}
6. 测试
@SpringBootTest
class BuilderDemoApplicationTests {
@Test
void contextLoads() {
ComputerBuilder computerBuilder = new ConcreteDellBuilder();
ComputerDirector computerDirector = new ComputerDirector(computerBuilder);
Computer computer = computerDirector.computerConductor();
}
}
运行结果
源码: https://download.csdn.net/download/javanbme/17490645