建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
用大白话讲就是:一个完整的java bean对象,给它的各个属性都附上值,正常我们是这样写的new一个对象,然后给它各种set值,使用了建造者模式后,我们将set的工作交由一个builder类来完成,该类有各种赋值的方法,并返回一个完整的对象,而这个builder类交给一个指挥者类(Dirextor)来调用builder类的方法完成,可以按照我们的需要的不同的组合来写指挥者类,得到不同组合的一个对象.
我们不需要关系这个对象是怎么组装的,直接调用接口就能得到完整对象
包含角色:
Builder:抽象的建造者,一个抽象接口或抽象类,规范了产品哪些部件要创建,并不参与具体的创建过程,将交由其子类来具体创建
ConcreteBulider:具体建造者,抽象Builder的具体实现,实现builder抽象的方法,返回一个组建好的对象
Dirextor:指挥者,调用ConcreteBulider来负责对象的具体组装流程
Product:产品类
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
就拿我们要字组装一台电脑:电脑有 cpu,显卡,硬盘,固态硬盘等,也不是所有人都要给这些装上的,有些人为了性能好些会给装上个固态硬盘,也有些会不需要固态硬盘,这样的话我们的电脑组装者按照不需求配置不同的电脑(电脑组装者就当于dirextor)
代码实现:
Product:产品类
public class Computer {
private String cpu;
private String xk;
private String yp;
private String ktyp;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getXk() {
return xk;
}
public void setXk(String xk) {
this.xk = xk;
}
public String getYp() {
return yp;
}
public void setYp(String yp) {
this.yp = yp;
}
public String getKtyp() {
return ktyp;
}
public void setKtyp(String ktyp) {
this.ktyp = ktyp;
}
@Override
public String toString() {
return "Computer [cpu=" + cpu + ", xk=" + xk + ", yp=" + yp + ", ktyp=" + ktyp + "]";
}
}
Builder:抽象建造者
public interface Builder {
public void assembleCpu();
public void assembleXk();
public void assembleYp();
public void assembleKtyp();
public Computer creatComputer();
}
ConcreteBulider:具体建造者
public class ComputerBuilder implements Builder {
Computer computer=new Computer();
public void assembleCpu() {
computer.setCpu("组装cpu");
}
public void assembleXk() {
computer.setXk("组装显卡");
}
public void assembleYp() {
computer.setYp("组装硬盘");
}
public void assembleKtyp() {
computer.setKtyp("组装固态硬盘");
}
public Computer creatComputer(){
return computer;
}
}
Dirextor:指挥者
public class ComputerDirextor {
public Builder assembleComputer(Builder builder){
builder.assembleCpu();
builder.assembleKtyp();
builder.assembleKtyp();
return builder;
}
}
测试
public static void main(String[] args) {
ComputerDirextor cd=new ComputerDirextor();
Builder builder = cd.assembleComputer(new ComputerBuilder());
Computer computer = builder.creatComputer();
System.out.println(computer);
}
结果
Computer [cpu=组装cpu, xk=null, yp=null, ktyp=组装固态硬盘]
要组装什么样的电脑就看指挥者怎么去组装咯.......