理解
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 比如装电脑,我们只需要提供各个部件(cpu,主板,显卡)的配置。其他事我们不用管,交给电脑商家。
术语
- Director: 指挥者类,用于统一组装流程,对外暴露一个方法让客户传递电脑的型号参数即可,构造者模式隐藏构造流程细节的体现。
- Builder:抽象Builder类,规范产品的组建,注意这里的组建并不要和上面的Director的组建搞混了,这里的组建只是分解出”每一个”部件的”细节上的”组建技术,而并非是整个流程下来的按流程的组建。另外它是一个抽象接口,具体的实现细节又接下来的角色进行。
- ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象。
- Product: 产品类
图片转自刘望舒的博客:http://liuwangshu.cn/designpatterns/3-builder.html
这张图分析一下:
1.Builder是属于Director的一员(聚合)。因为Director需要使用Builder的各个细节的组建方法用正确的顺序来组建一台电脑。
2.ConcreteBuilder是Builder的子类/实现类(继承/实现)。
3.Product被ConcreteBuilder产出(依赖)。
代码实践
Computer.java
package com.zj.dp.构建者模式;
public class Computer {
private String mCpu;
private String mMainBorad;
private String mVideoCard;
public Computer() {
}
@Override
public String toString() {
return "Computer{" +
"mCpu='" + mCpu + '\'' +
", mMainBorad='" + mMainBorad + '\'' +
", mVideoCard='" + mVideoCard + '\'' +
'}';
}
public Computer(String mCpu, String mMainBorad, String mVideoCard) {
this.mCpu = mCpu;
this.mMainBorad = mMainBorad;
this.mVideoCard = mVideoCard;
}
public String getCpu() {
return mCpu;
}
public void setCpu(String mCpu) {
this.mCpu = mCpu;
}
public String getMainBorad() {
return mMainBorad;
}
public void setMainBorad(String mMainBorad) {
this.mMainBorad = mMainBorad;
}
public String getVideoCard() {
return mVideoCard;
}
public void setVideoCard(String mVideoCard) {
this.mVideoCard = mVideoCard;
}
}
Builder.java
package com.zj.dp.构建者模式;
public interface Builder {
void installCpu(String cpu);
void installMainCard(String mainCard);
void installVideoCard(String showCard);
Computer create();
}
LogicComputerBuilder.java
package com.zj.dp.构建者模式;
public class LogicComputerBuilder implements Builder{
Computer mComputer = new Computer();
@Override
public void installCpu(String cpu) {
mComputer.setCpu(cpu);
}
@Override
public void installMainCard(String mainCard) {
mComputer.setMainBorad(mainCard);
}
@Override
public void installVideoCard(String videoCard) {
mComputer.setVideoCard(videoCard);
}
@Override
public Computer create() {
return mComputer;
}
}
Director.java
package com.zj.dp.构建者模式;
/**
* 商家的指挥者类用来规范组装电脑的流程规范
* <p>
* 先安装主板
* 再安装CPU
* 最后安装内存并组装成电脑:
*/
public class Director {
Builder mBuilder = null;
public Director(Builder mBuilder) {
this.mBuilder = mBuilder;
}
public Computer CreateComputer(String cpu, String mainBoard, String videoCard) {
this.mBuilder.installCpu(cpu);
this.mBuilder.installMainCard(mainBoard);
this.mBuilder.installVideoCard(videoCard);
return mBuilder.create();
}
}
TestBuildler.java
package com.zj.dp.构建者模式;
public class TestBuildler {
public static void main(String[] args) {
LogicComputerBuilder logicComputerBuilder = new LogicComputerBuilder();
Director director = new Director(logicComputerBuilder);
Computer computer = director.CreateComputer("intel-i7-8700k", "技嘉-Z370", "NVIDIA-1080-Ti");
System.out.println(computer.toString());
}
}
输出
输出:Computer{mCpu='intel-i7-8700k', mMainBorad='技嘉-Z370', mVideoCard='NVIDIA-1080-Ti'}