生成器模式(又称建造者模式)属于创建型模式,其是将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它按照一个指定的过程逐步创建一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不必知道内部的具体构建细节。
建造者模式包含的各组成部分意义如下:
(1)Builder:创建Product对象的抽象接口。
(2)ConcreteBuilder:
① 通过对抽象的Builder接口的具体实现,创建并组装创建这些对象的“零件”。
② 定义并且跟踪它所创建的产品的表示。
③ 提供一个接口以便能被调用,得到产品对象。
(3)Director:使用Builder接口创建一个完整产品对象,它负责管理正确的对象创建顺序,从参数中接受具体的ConcreteBuilder对象,并且执行这些对象的必要操作。
(4)Product
① 代表待创建的复杂对象,是ConcreteBuilder负责创建对象的内部表示,并且定义组装过程。
② 包含定义产品组件的子类,包括一个组装接口。
注意:产品类可以是一个单独类,也可以是一个带有子类的类结构体。是单独类时,ConcreteBuilder负责创建该单独类对象的内部表示;是类结构体时,ConcreteBuilder根据需要创建该类所需要的子类的对象的内部表示,然后在一起。
建造者模式特点:
(1)建造者模式让用户可以变化它建造产品的内部表达形式,它隐藏了产品是怎样被装配的细节。
(2)每个具体的建造者都独立于程序的其他建造者,因此改善了程序的模块化,并且使添加其他建造者变得相对简单。
(3)由于每个建造者根据数据逐步构建最终产品,用户对建造者的最终产品有更多控制。
(4)其和抽象工厂模式有相似之处,都返回由其他一些对象组成的类的对象。区别是,抽象工厂模式返回一个类族,而建造之模式逐步按照次序构建一个复杂的对象,最后返回该对象。
例如,在同一品牌情况下,客户会提出汽车部件的具体要求,如安装高等级的轮胎、天窗、巡航控制和卫星导航系统等。这样就要求将汽车的实际装配过程与具体的部件分离出来,为此汽车制造公司成立了指导部(Director),该部门负责规范汽车的装配流程和客户要求达到一致。
汽车是一个比较复杂的对象,其组成包括底盘(Chassis)、外壳(Frame)、轮子(Wheels)、引擎(Engine)、油箱(GasTank)、油门(Accelerater)、刹车(Brake)、方向盘(SteeringWheel)、电池(Battery)、音响(Audio)、天窗(Sunroof)、巡航控制系统(Cruise Control)、卫星导航系统(GPS)等等。其装配过程用以下按照顺序写出来:buildChassis(); buildFrame(); buildWheels(); buildEngine(); buildGasTank(); buildAccelerater(); buildBrake(); buildSteeringWheel(); buildBattery(); buildAudio(); buildSunroof(); buildCruiseContorl(); buildGPS();
package cn.szxy.hq;
/**
* 建造者接口
*
* @author HQ
* @e-mail [email protected]
* @date 2018/11/26.
*/
public interface Builder {
Product product = new Product();
void buildChassis();
void buildFrame();
void buildWheels();
void buildEngine();
void buildGasTank();
void buildAccelerater();
void buildBrake();
void buildSteeringWheel();
void buildBattery();
void buildAudio();
void buildSunroof();
void buildCruiseContorl();
void buildGPS();
Product getResult();
}
package cn.szxy.hq;
/**
* 具体建造者
*
* @author HQ
* @e-mail [email protected]
* @date 2018/11/26.
*/
public class ConcreteBuilder implements Builder {
@Override
public void buildChassis() {
product.setChassis("装配底盘");
}
@Override
public void buildFrame() {
product.setFrame("装配外壳");
}
@Override
public void buildWheels() {
product.setWheels("装配轮子");
}
@Override
public void buildEngine() {
product.setEngine("装配引擎");
}
@Override
public void buildGasTank() {
product.setGasTank("装配邮箱");
}
@Override
public void buildAccelerater() {
product.setAccelerater("装配油门");
}
@Override
public void buildBrake() {
product.setBrake("装配刹车");
}
@Override
public void buildSteeringWheel() {
product.setSteeringWheel("装配方向盘");
}
@Override
public void buildBattery() {
product.setBattery("装配电池");
}
@Override
public void buildAudio() {
product.setAudio("装配音响");
}
@Override
public void buildSunroof() {
product.setSunroof("装配天窗");
}
@Override
public void buildCruiseContorl() {
product.setCruiseControl("装配巡航控制");
}
@Override
public void buildGPS() {
product.setGps("装配GPS");
}
@Override
public Product getResult() {
return product;
}
}
package cn.szxy.hq;
/**
* 指挥者
*
* @author HQ
* @e-mail [email protected]
* @date 2018/11/26.
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
/**
* 产品构建组装方法
*
* @return
*/
public Product construct() {
builder.buildChassis();
builder.buildFrame();
builder.buildWheels();
builder.buildGasTank();
builder.buildAccelerater();
builder.buildBrake();
builder.buildSteeringWheel();
builder.buildBattery();
builder.buildAudio();
builder.buildSunroof();
builder.buildCruiseContorl();
builder.buildGPS();
return builder.getResult();
}
}
package cn.szxy.hq;
import com.sun.xml.internal.ws.api.ha.StickyFeature;
/**
* 产品类
*
* @author HQ
* @e-mail [email protected]
* @date 2018/11/26.
*/
public class Product {
private String chassis;
private String frame;
private String wheels;
private String engine;
private String gasTank;
private String accelerater;
private String brake;
private String steeringWheel;
private String battery;
private String audio;
private String sunroof;
private String cruiseControl;
private String gps;
public void setChassis(String chassis) {
this.chassis = chassis;
}
public void setFrame(String frame) {
this.frame = frame;
}
public void setWheels(String wheels) {
this.wheels = wheels;
}
public void setEngine(String engine) {
this.engine = engine;
}
public void setGasTank(String gasTank) {
this.gasTank = gasTank;
}
public void setAccelerater(String accelerater) {
this.accelerater = accelerater;
}
public void setBrake(String brake) {
this.brake = brake;
}
public void setSteeringWheel(String steeringWheel) {
this.steeringWheel = steeringWheel;
}
public void setBattery(String battery) {
this.battery = battery;
}
public void setAudio(String audio) {
this.audio = audio;
}
public void setSunroof(String sunroof) {
this.sunroof = sunroof;
}
public void setCruiseControl(String cruiseControl) {
this.cruiseControl = cruiseControl;
}
public void setGps(String gps) {
this.gps = gps;
}
public void show() {
System.out.println("这是宝马520!");
}
}
package cn.szxy.hq;
/**
* 客户端
* @author HQ
* @e-mail [email protected]
* @date 2018/11/26.
*/
public class Driver {
public static void main(String[] args) {
Builder builder=new ConcreteBuilder();
Director director=new Director(builder);
Product product=director.construct();
product.show();
}
}