建造者模式(Builder Pattern)

来源:互联网 发布:1月8日制造业数据 编辑:程序博客网 时间:2024/06/06 11:50

什么是建造者模式?

建造者模式(Builder Pattern)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

建造模式的本质

  • 分离了对象组件的单独构造(由Builder来负责)和装配(由Driector负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。

使用场景

  • 我们要建造一个复杂产品。比如:神舟飞船,Iphone。这个复杂产品的创建,有这样一个问题要处理:装配这些子组件是不是有个步骤问题?
  • 实际开发中,我们所要构建的对象十分复杂,有很多步骤需要处理时。

Java中的应用场景

  • StringBuilder类的append方法
  • SQL中的PreparedStatement
  • JDOM中,DomeBuiler,SAXBuilder

下面以建造神舟5号飞船说明,我们这里只是建造一个简单的神舟5号飞船了,它由发动机,逃逸塔,轨道舱组成,Builder负责构建这些组件,Driector负责将它们装配成神舟5号飞船。

类图

代码

package com.match.builder;/** * Builder接口 * @author Match * */public interface AirShipBuilder{    //构建发动机    Engine builderEngine();    //构建轨道舱    OrbitalModule builderOrbitalModule();    //构建逃逸塔    EscapeTower builderEscapeTower();}package com.match.builder;/** * Director接口 * @author Match * */public interface AirShipDirector{    //组装飞船    AirShip directAirShip();}package com.match.builder;/** * Builder类负责构造组件 * @author Match * */public class AirShip_5Builder implements AirShipBuilder {    @Override    public Engine builderEngine()    {        System.out.println("建造发动机");        return new Engine("神舟5号发动机");    }    @Override    public EscapeTower builderEscapeTower()    {        System.out.println("建造逃逸塔");        return new EscapeTower("神舟5号逃逸塔");    }    @Override    public OrbitalModule builderOrbitalModule()    {        System.out.println("建造轨道舱");        return new OrbitalModule("神舟5号轨道舱");    }       }package com.match.builder;/** * Director类负责装配生产成品 * @author Match * */public class Airship_5Director implements AirShipDirector{    private AirShipBuilder builder;    public Airship_5Director(AirShipBuilder builder)    {        this.builder = builder;    }    @Override    public AirShip directAirShip()    {        Engine e = builder.builderEngine();        OrbitalModule o = builder.builderOrbitalModule();        EscapeTower et = builder.builderEscapeTower();        //装配成飞船对象        AirShip ship = new AirShip();        System.out.println("装配"+e.getName());        ship.setEngine(e);        System.out.println("装配"+et.getName());        ship.setEscapeTower(et);        System.out.println("装配"+o.getName());        ship.setOrbitalModule(o);        return ship;    }}package com.match.builder;/** * 发动机 * @author Match * */public 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;    }}package com.match.builder;/** * 逃逸塔 * @author Match * */public 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;    }   }package com.match.builder;/** * 轨道舱 * @author Match * */public 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;    }}package com.match.builder;/** * 飞船 * @author Match * */public class AirShip{    private OrbitalModule orbitalModule;//轨道舱    private Engine engine;//发动机    private EscapeTower escapeTower;//逃逸塔    public void launch()    {        System.out.println("发射!");    }    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;    }   }

测试代码:

package com.match.builder;public class Client{    public static void main(String[] args)    {        AirShipDirector director = new Airship_5Director(new AirShip_5Builder());        AirShip ship = director.directAirShip();        ship.launch();      }}

控制台输出:

建造发动机
建造轨道舱
建造逃逸塔
装配神舟5号发动机
装配神舟5号逃逸塔
装配神舟5号轨道舱
发射!

原创粉丝点击