简介

建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。

当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。

作用

  1. 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
  2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  3. 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。

实现步骤

  1. 定义主管类,可以制造所有形式的产品。
  2. 在基本生成器接口中声明创建产品的步骤。
  3. 为每个形式的产品创建具体生成器类,并实现其构造步骤。
  4. 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。

UML

代码

创建建造者接口

//Builder.java 建造者接口,定义基本建造方法
public interfaceBuilder {public voidreset();public voidsetName(String name);public voidsetScreen(Integer[] screen);public voidsetGPU(Integer no); 
}

具体建造者类,可以多个

//ManualBuilder.java 使用手册建造者类也实现了建造者接口
public class ManualBuilder implementsBuilder {privateManual manual;public voidreset() {this.manual = newManual();
}
public voidsetName(String name) {this.manual.setName(name);
}
public voidsetScreen(Integer[] screen) {this.manual.setScreen(screen);
}
public voidsetGPU(Integer no) {this.manual.setGpuType(no);
}
publicManual getProduct() {return this.manual;
}
}
//PhoneBuilder.java 手机建造者实现了建造者接口 public class PhoneBuilder implementsBuilder {privatePhone phone;public voidreset() {this.phone = newPhone();
}
public voidsetName(String name) {this.phone.setName(name);
}
public voidsetScreen(Integer[] screen) {this.phone.setScreen(screen);
}
public voidsetGPU(Integer no) {this.phone.setGpuType(no);
}
publicPhone getProduct() {return this.phone;
}
}

定义具体产品类,不同建造者建造不同产品

//Manual.java 手册产品类
public classManual {private String name = "PhoneManualName";private Integer[] screen = { 0, 0};private Integer gpuType = 0;private Integer pages = 0;public voidsetName(String name) {this.name =name;
}
publicString getName() {return this.name;
}
public voidsetScreen(Integer[] screen) {this.screen =screen;
}
publicInteger[] getScreen() {return this.screen;
}
......

}
//Phone.java 手机产品类 public classPhone {private String name = "PhoneName";private Integer[] screen = { 0, 0};private Integer gpuType = 0;public voidsetName(String name) {this.name =name;
}
publicString getName() {return this.name;
}
public voidsetScreen(Integer[] screen) {this.screen =screen;
}
publicInteger[] getScreen() {return this.screen;
}
......

}

指挥调度类

//Director.java 指挥调度类,负责利用建造者建造产品,隔离需求与功能
public classDirector {//建造phone1
  public voidbuildIPhone(Builder builder) {
builder.reset();
Integer[] screen
= { 120, 500};
builder.setName(
"iPhone");
builder.setScreen(screen);
builder.setGPU(
100);
}
//建造phone2 public voidbuildHuaweiPhone(Builder builder) {
builder.reset();
Integer[] screen
= { 130, 600};
builder.setName(
"HuaweiPhone");
builder.setScreen(screen);
builder.setGPU(
102);
}
//建造phone3 public voidbuildMiPhone(Builder builder) {
builder.reset();
Integer[] screen
= { 120, 650};
builder.setName(
"MiPhone");
builder.setScreen(screen);
builder.setGPU(
103);
}

}

测试调用

    /*** 建造者模式是使用多个简单的对象一步一步构建出一个复杂的对象来。
* 分为主管类和建造这类,主管类负责具体指挥调度,建造负责具体实施。
* 主管类通过一步一步调用各种建造者实现复杂对象。
*/ //声明指挥者 Director director = newDirector();//创建手机 PhoneBuilder phoneBuilder = newPhoneBuilder();
director.buildMiPhone(phoneBuilder);
Phone miPhone
=phoneBuilder.getProduct();
System.out.println(
"miPhone:" + miPhone.getName() + " | " +miPhone.getGpuType().toString());//创建手册 ManualBuilder manualBuilder = newManualBuilder();
director.buildMiPhone(manualBuilder);
Manual manual
=manualBuilder.getProduct();
System.out.println(
"manual:" + manual.getName() + " | " + manual.getGpuType().toString());

更多语言版本

不同语言实现设计模式:
https://github.com/microwind/design-pattern

标签: none

添加新评论