什么是建造者模式
看到建造,就能看出这是跟创建对象有关的,那么作用呢?官方给出的答案是:
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
有点抽象,举个生活中的例子吧。年少有为的你在所在的城市买了一套房,准备着手装修,但是要装修成什么风格呢,很苦恼,索性就找了个设计师,让他帮你设计。设计师接下了单子,很快就给看了几套设计方案,你觉得都不错,都想要,可是你只有一套房子,没办法,只能再买一套满足自己了。于是你分别联系好了装修人员,将两个设计方案给了他,装修人员便按照设计方案分别给这两套房装修。
总结一下,你要装修房子,这相当于一个复杂对象的构建,你给了装修工人不同的设计方案,就呈现出了不一样的表示,也就是构建出来的效果不一样。
建造者模式有以下四种角色:
Product: 最终要生成的对象
Builder: 构建者的抽象基类(有时会使用接口代替)。其定义了构建Product的抽象步骤,其实体类需要实现这些步骤。其会包含一个用来返回最终产品的方法Product getProduct()。
ConcreteBuilder: Builder的实现类。
Director: 决定如何构建最终产品的算法. 其会包含一个负责组装的方法void Construct(Builder builder), 在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的 getProduct() 方法获得最终的产品。
建造者模式的代码实现
就拿我们去电脑城组装电脑的例子来说,首先创建我们的Product,也就是电脑
public class Computer {
private String mainboard;
private String cpu;
private String ram;
private String display;
private String master;
public void setMainboard(String mainboard) {
this.mainboard = mainboard;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setRam(String ram) {
this.ram = ram;
}
public void setDisplay(String display) {
this.display = display;
}
public void setMaster(String master) {
this.master = master;
}
@Override
public String toString() {
return "Computer{" +
"mainboard='" + mainboard + '\'' +
", cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", display='" + display + '\'' +
", master='" + master + '\'' +
'}';
}
}
然后就是我们的builder
public interface Builder {
public void setMainboard();
public void setCpu();
public void setRam();
public void setDisplay();
public void setMaster();
public Computer getComputer();
}
之后就是ConcreteBuilder,我们来个中配和高配电脑
首先是中配电脑
public class MediumBulider implements Builder {
private Computer computer;
public MediumBulider(){
computer=new Computer();
}
@Override
public void setMainboard() {
computer.setMainboard("中级的主板");
}
@Override
public void setCpu() {
computer.setCpu("中级的cpu");
}
@Override
public void setRam() {
computer.setRam("中级的内存");
}
@Override
public void setDisplay() {
computer.setDisplay("中级的显示器");
}
@Override
public void setMaster() {
computer.setMaster("中级的主机");
}
@Override
public Computer getComputer() {
return this.computer;
}
}
再来个高配的
public class HighBuilder implements Builder {
private Computer computer;
public HighBuilder(){
computer=new Computer();
}
@Override
public void setMainboard() {
computer.setMainboard("高级的主板");
}
@Override
public void setCpu() {
computer.setCpu("高级的cpu");
}
@Override
public void setRam() {
computer.setRam("高级的内存");
}
@Override
public void setDisplay() {
computer.setDisplay("高级的显示器");
}
@Override
public void setMaster() {
computer.setMaster("高级的主机");
}
@Override
public Computer getComputer() {
return this.computer;
}
}
还需要个Director
public class Directoer {
public void construt(Builder builder){
builder.setCpu();
builder.setDisplay();
builder.setMainboard();
builder.setMaster();
builder.setRam();
}
}
这样我们四个角色就创建好了,测试一下
@Test
public void shouldAnswerWithTrue()
{
Builder builder=new MediumBulider();
Builder builder2=new HighBuilder();
Directoer directoer=new Directoer();
directoer.construt(builder);
directoer.construt(builder2);
Computer mdcomputer=builder.getComputer();
Computer Hgcomputer=builder2.getComputer();
System.out.println(mdcomputer);
System.out.println(Hgcomputer);
}