创建者模式

链接: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());
        
    }

}

 

结果:

 

posted @ 2020-03-27 18:36  tang_lei  阅读(254)  评论(0)    收藏  举报