博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式
阅读量:7032 次
发布时间:2019-06-28

本文共 3410 字,大约阅读时间需要 11 分钟。

应用场景


将各个零件组装起来,比如我们需要组装手机,组装电脑等等。当构建的对象很复杂的时候,需要用到建造者模式。

本质


将子组件的单独构造(由Builder来负责)和装配(由Director负责)进行了分离,这种模式适用于某个对象在构建过程复杂的情况下。由于将构建与装配解耦,不同的构建器,相同的装配也可以产生不同的对象。构建器相同,但装配不同,也可以产生不同的对象。

示例


实体类

实体类表示各个部件具体的类,比如飞船应该有自己的实体类,然后飞船内部有轨道舱、逃逸塔、引擎的实体类。

package com.dy.xidian;public class AirShip {    private OrbitalModule orbitalModule;    private Engine engine;    private EscapeTower escapeTower;    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) {        super();        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

构建器接口

为了解耦,我们需要为不同构建器定义自己的接口类。

package com.dy.xidian;public interface AirShipBuilder {    Engine builerEngine();    OrbitalModule builerOrbitalModule();    EscapeTower builderEscapeTower();}

 

构建器类

package com.dy.xidian;public class AirShipBuilderImpl implements AirShipBuilder {    @Override    public Engine builerEngine() {        System.out.println("发动机");        return new Engine("构建发动机");    }    @Override    public OrbitalModule builerOrbitalModule() {        System.out.println("轨道舱");        return new OrbitalModule("构建轨道舱");    }    @Override    public EscapeTower builderEscapeTower() {        System.out.println("逃逸塔");        return new EscapeTower("构建逃逸塔");    }}

 

装配器接口 

装配器通过装配应该返回一个装配好的对象

package com.dy.xidian;public interface AirShipDirector {    AirShip directorAirShip();}

 

装配器类

package com.dy.xidian;public class AirShipDirectorImpl implements AirShipDirector {    private AirShipBuilder builder;    public AirShipDirectorImpl(AirShipBuilder builder) {        this.builder = builder;    }    @Override    public AirShip directorAirShip() {        Engine e = builder.builerEngine();        OrbitalModule o = builder.builerOrbitalModule();        EscapeTower et = builder.builderEscapeTower();        AirShip ship = new AirShip();        ship.setEngine(e);        ship.setEscapeTower(et);        ship.setOrbitalModule(o);        return ship;    }}

 

装配器在装配时首先要通过builder类将各个部件构造出来,然后对其组装。这里的builder可以使用简单工厂模式来生成各个部件。

客户

package com.dy.xidian;public class Clinet {    public static void main(String[] args) {        AirShipDirector director = new AirShipDirectorImpl(                new AirShipBuilderImpl());        AirShip ship = director.directorAirShip();    }}

 

客户选择一个具体的构建器,让装配器对其进行组装。

应用


 

StringBuilder类的append方法

JDOM中的DOMBuiler,SAXBuilder方法 

转载于:https://www.cnblogs.com/xidongyu/p/5626287.html

你可能感兴趣的文章
技术寡头争霸传之:控制开源工具,就控制了整个生态
查看>>
微软把UWP定位成业务线应用程序开发平台
查看>>
2018腾讯云+未来峰会互联网专场:腾讯云智能物联解决方案亮相
查看>>
Python数据可视化的10种技能
查看>>
关于有效的性能调优的一些建议
查看>>
微软发起Java on Azure调查,呼吁Java社区积极参与
查看>>
搭建svn仓库
查看>>
JavaScript arguments 对象详解
查看>>
[elixir! #0002] [译] 在Phoenix中实现动态表单 by José Valim
查看>>
【windows docker & centos 6 .7搭建】
查看>>
Firefox插件开发:夜间模式
查看>>
这是我第一次遇到判断ios系统版本的问题
查看>>
漏洞战争: 软件漏洞发展趋势
查看>>
数人云CTO解读Docker 1.12和金融业容器化
查看>>
PyMongo 连接问题
查看>>
切图崽的自我修养-合理组织CSS结构
查看>>
【编码】Font Size-微软实习笔试编程题(一)-2016.04.06
查看>>
PHP|PHP引用的简单解释
查看>>
gulp之JS、CSS、HTML、图片压缩以及版本更新
查看>>
实录分享|一篇文章看CNTV的容器化探索和平台搭建
查看>>