创建者模式
链接:https://www.bilibili.com/video/BV14a4y1t7XZ/
什么是建造者模式
创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使
得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
适用场景
- 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
- 多个部件都可以装配到一个对象中,但产生的运行结果不相同
- 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
- 初始化一个对象时,参数过多,或者很多参数具有默认值
- Builder模式不适合创建差异性很大的产品类
产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本 - 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
UML类图
举例
太空飞船类:
package Builder; public class AirShip {//飞船 private OrbitalModule orbitalModule;//轨道舱 private Engine engine;//发动机 private EscapeTower escapeTower;//逃逸塔 //getter,setter方法 public OrbitalModule getOrbitalModule() { return orbitalModule; } public void setOrbitalModule(OrbitalModule orbitalModule) { this.orbitalModule = orbitalModule; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } 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 Engine{//发动机类 private String name; public Engine(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; } }
建造者接口(Builder):
package Builder; public interface AirShipBuilder {//飞船建造接口 OrbitalModule builderOrbitalModule(); Engine builderEngine(); EscapeTower builderEscapeTower(); }
装配接口(Director):
package Builder; public interface AirShipDirector {//飞船装配接口 AirShip directAirShip(); }
建造实现类:
package Builder; public class ApolloAirShipBuilder implements AirShipBuilder{ @Override public OrbitalModule builderOrbitalModule() { System.out.println("构造阿波罗飞船轨道舱"); // TODO 自动生成的方法存根 return new OrbitalModule("阿波罗飞船轨道舱"); } @Override public Engine builderEngine() { System.out.println("构造阿波罗飞船发动机"); // TODO 自动生成的方法存根 return new Engine("阿波罗飞船发动机"); } @Override public EscapeTower builderEscapeTower() { System.out.println("构造阿波罗飞船逃逸塔"); // TODO 自动生成的方法存根 return new EscapeTower("阿波罗飞船逃逸塔"); } }
Apollo飞船装配实现方法:
package Builder; public class AoplloAirShipDirector implements AirShipDirector{ private AirShipBuilder builder;//存储获得对象的引用 public AoplloAirShipDirector(AirShipBuilder builder) { this.builder = builder; } @Override public AirShip directAirShip() { //装配者调用建造者方法建造组件 OrbitalModule o = builder.builderOrbitalModule(); Engine e = builder.builderEngine(); EscapeTower et = builder.builderEscapeTower(); //装配成飞船对象 AirShip ship = new AirShip(); ship.setEngine(e); ship.setEscapeTower(et); ship.setOrbitalModule(o); // TODO 自动生成的方法存根 return ship; } }
Client类:
package Builder; public class Client { public static void main(String[] args) { AirShipDirector dirctor = new AoplloAirShipDirector(new ApolloAirShipBuilder()); AirShip Apollo = dirctor.directAirShip(); System.out.println(Apollo.getEngine()); System.out.println(Apollo.getEscapeTower()); System.out.println(Apollo.getOrbitalModule()); } }
结果:


浙公网安备 33010602011771号