源码在我的 github和 gitee中获取
建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一句话概括就是建造者模式的目的是为了分离复杂对象的属性与创建过程。
一、介绍
意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用: 一些基本部件不会变,而其组合经常变化的时候。
如何解决: 将变与不变分离开。
关键代码: 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构,这些产品对象通常包含多个成员属性。 2、需要生成的对象内部属性本身相互依赖。
**注意事项:**与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
以上部分根据菜鸟教程修改
二、实现
我们知道一个电脑生产出来是需要很多部件的,例如cpu,显卡,硬盘,屏幕,主板等等。
新建一个Computer类
/**
* @author codermy
* @createTime 2020/7/24
*/
@Data
public class Computer {
private String mainBoard;//主板
private String cpu;//cpu
private String ideoCard;//显卡
private String hardDisk;//硬盘
private String memorie; //内存条
}
在生成一个用于建造电脑工序的类
/**
* @author codermy
* @createTime 2020/7/24
* 一台电脑需要完成的工序
*/
public interface ComputerBuilder {
void buildMainBoard();
void buildCpu();
void buildIdeoCard();
void buildHardDisk();
void buildMemorie();
// 建造结果
Computer build();
}
现在一共可以成产两种电脑,分别是飞行堡垒 和 拯救者。
飞行堡垒制作工序
/**
* @author codermy
* @createTime 2020/7/24
* 飞行堡垒6
*/
public class ComputerA implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildMainBoard() {
computer.setMainBoard("X550JK");
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i5");
}
@Override
public void buildIdeoCard() {
computer.setIdeoCard("GTX1060");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("256GB+1TB混合硬盘");
}
@Override
public void buildMemorie() {
computer.setMemorie("DDR4 8GB×1");
}
@Override
public Computer build() {
return computer;
}
}
拯救者制作工序
/**
* @author codermy
* @createTime 2020/7/24
* 拯救者
*/
public class ComputerB implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildMainBoard() {
computer.setMainBoard("15Isk");
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i7");
}
@Override
public void buildIdeoCard() {
computer.setIdeoCard("GTX1050Ti");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("256GB+1TB混合硬盘");
}
@Override
public void buildMemorie() {
computer.setMemorie("DDR4 16GB×1");
}
@Override
public Computer build() {
return computer;
}
}
新建一个指挥者来指挥完成相应的制作流程
public class Conductor {
private ComputerBuilder computerBuilder;
public void setComputerBuilder(ComputerBuilder computerBuilder){
this.computerBuilder = computerBuilder;
}
// 指挥建造过程
public Computer make(){
computerBuilder.buildMainBoard();
computerBuilder.buildCpu();
computerBuilder.buildHardDisk();
computerBuilder.buildIdeoCard();
computerBuilder.buildMemorie();
return computerBuilder.build();
}
}
客户要求
/**
* @author codermy
* @createTime 2020/7/24
* 客户
*/
public class Client {
public static void main(String[] args) {
// 一个指挥者
Conductor conductor = new Conductor();
// 需要ComputerA 飞行堡垒
ComputerA fxbl = new ComputerA();
// 指挥建造ComputerA
conductor.setComputerBuilder(fxbl);
// 得到飞行堡垒
Computer computer1= conductor.make();
System.out.println(computer1);
// 一个指挥者
Conductor conductor2 = new Conductor();
// 需要ComputerA 拯救者
ComputerB zjz = new ComputerB();
// 指挥建造ComputerB
conductor2.setComputerBuilder(zjz);
// 得到拯救者
Computer computer2= conductor2.make();
System.out.println(computer2);
}
}
输出
Computer(mainBoard=X550JK, cpu=Intel Core i5, ideoCard=GTX1060, hardDisk=256GB+1TB混合硬盘, memorie=DDR4 8GB×1)
Computer(mainBoard=15Isk, cpu=Intel Core i7, ideoCard=GTX1050Ti, hardDisk=256GB+1TB混合硬盘, memorie=DDR4 16GB×1)