生成器模式(建造者模式)
1.生成器模式是将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。适合该模式的情景如下:对象复杂,利用构造方法创建对象无法满足客户需求;对象创建过程必须独立于创建该对象的类。
2.1)产品(Product):具体生产器要构造的复杂对象;
(2)抽象生成器(Bulider):抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义了若干个方法之外,还要定义返回Product对象的方法;
(3)具体生产器(ConcreteProduct):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法;
(4)指挥者(Director):指挥者是一个类,该类需要含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器,即指挥者将请求具体生成器类来构造用户所需要的Product对象,如果所请求的具体生成器成功地构造出Product对象,指挥者就可以让该具体生产器返回所构造的Product对象。
演示代码如下:
产品(Product)层:
/*
想要创建一个宇宙飞船的产品
包含飞船的引擎;逃生舱;轨道舱等部分
*/
public class AirShipProduct {
private OrbitalModule orbitalModule; //轨道舱
private Enginee enginee; //引擎
private EscapeTower escapeTower; //逃生舱
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public Enginee getEnginee() {
return enginee;
}
public void setEnginee(Enginee enginee) {
this.enginee = enginee;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
}
class OrbitalModule{
private String name;
public OrbitalModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Enginee{
private String name;
public Enginee(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class EscapeTower {
private String name;
public EscapeTower(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
抽象生成器(Bulider)层:
/**
* 产品生成器
*/
public interface AirShipBuidler {
Enginee builderEnginee();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
}
具体生产器(ConcreteProduct)层:
//构建者实现类
public class AirShipBuilderImpl implements AirShipBuidler{
@Override
public Enginee builderEnginee() {
System.out.println("装配比亚迪引擎");
return new Enginee("比亚迪引擎");
}
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("装配比亚迪轨道舱");
return new OrbitalModule("比亚迪轨道舱");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("装配比亚迪逃生舱");
return new EscapeTower("比亚迪逃生舱");
}
}
指挥者(Director)层:
/**
* 指挥者 进行装配
*/
public interface AirShipDirector {
//组装飞船
AirShipProduct director();
}
//指挥者实现类
public class AirShipDirectorImpl implements AirShipDirector {
private AirShipBuidler buidler;
public AirShipDirectorImpl(AirShipBuidler buidler) {
this.buidler = buidler;
}
@Override
public AirShipProduct director() {
//构建飞船所需的各个部分
Enginee enginee = buidler.builderEnginee();
EscapeTower escapeTower = buidler.builderEscapeTower();
OrbitalModule orbitalModule = buidler.builderOrbitalModule();
//装配飞船
AirShipProduct product = new AirShipProduct();
product.setEnginee(enginee);
product.setEscapeTower(escapeTower);
product.setOrbitalModule(orbitalModule);
return product;
}
}
测试端:
/*
测试
*/
public class Cilent {
public static void main(String[] args) {
AirShipDirector director = new AirShipDirectorImpl(new AirShipBuilderImpl());
AirShipProduct product = director.director();
System.out.println(product.getEnginee().getName());
}
}