zoukankan      html  css  js  c++  java
  • ⑥ 设计模式的艺术-06.建造者(Builder)模式

    场景

    我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:

    装配这些子组件是不是有个步骤问题?

    实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

    建造模式的本质

    分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。

    由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。

    也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

     

    代码示例

    AirShip.java

    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;
        }    
    }
    
    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 String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public EscapeTower(String name) {
            super();
            this.name = name;
        }
    }

    AirShipBuilder.java

    public interface AirShipBuilder {
        Engine builderEngine();
        OrbitalModule builderOrbitalModule();
        EscapeTower  builderEscapeTower();
    }

    AirShipDirector.java

    public interface AirShipDirector {
        /**
         * 组装飞船对象
         * @return
         */
        AirShip   directAirShip();
    }

    SxtAirShipBuilder.java

    public class SxtAirShipBuilder implements AirShipBuilder {
        //StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
        @Override
        public Engine builderEngine() {
            System.out.println("构建发动机!");
            return new Engine("发动机!");
        }
    
        @Override
        public EscapeTower builderEscapeTower() {
            
            System.out.println("构建逃逸塔");
            return new EscapeTower("逃逸塔");
        }
    
        @Override
        public OrbitalModule builderOrbitalModule() {
            System.out.println("构建轨道舱");
            return new OrbitalModule("轨道舱");
        }    
        
    }

    SxtAirshipDirector.java

    public class SxtAirshipDirector implements AirShipDirector {
    
        private AirShipBuilder builder;
    
        public SxtAirshipDirector(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();
            ship.setEngine(e);
            ship.setEscapeTower(et);
            ship.setOrbitalModule(o);
            
            return ship;
        }
    
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            
            AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());
    
            AirShip ship = director.directAirShip();
            
            System.out.println(ship.getEngine().getName());
            
            ship.launch();
        }
    }

    开发中应用场景

    StringBuilder类的append方法

    SQL中的PreparedStatement

    JDOM中,DomBuilder、SAXBuilder

  • 相关阅读:
    双USB墙壁电源插座面板....制作详解-电子产品世界论坛
    公共充电站?不用守着手机充电了 | 爱范儿
    公司简介-远能电气
    连接器|网络滤波连接器|电脑连接器|RJ45变压器-华联威电子有限公司
    自己动手做简单移动电源
    移动电源市场有多乱?
    聚合物电池_百度百科
    电芯:聚合物的一定比18650更好_移动电源_移动电源评测-中关村在线
    图文:充电宝租借自助机现身江城_新浪财经_新浪网
    不按时归还,信用会有“污点”_新浪浙江_新浪网
  • 原文地址:https://www.cnblogs.com/cnki/p/8626393.html
Copyright © 2011-2022 走看看