zoukankan      html  css  js  c++  java
  • GOF23设计模式之建造者模式

    GOF23设计模式之建造者模式

    场景:

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

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

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

    本质:

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

    2)由于时下按了构建和装配的解耦。不同的构建起,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象。也就算实现了构建算法、装配算法的解耦,实现了更好的复用。

    package cn.taosir.design.create.builders;
    /**
     * 宇宙飞船
     * @author taosir
     *
     */
    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) {super();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) {super();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 cn.taosir.design.create.builders;
    
    public interface AirShipBuilder {
        Engine builderEngine();
        OrbitalModule builderOrbitalModule();
        EscapeTower builderEscapeTower();
    }
    package cn.taosir.design.create.builders;
    
    public interface AirShipDirector {
        /**
         * 组装飞船对象
         * @return
         */
        AirShip directAirShip();
    }
    package cn.taosir.design.create.builders;
    
    public class TaoSirAirShipBuilder implements AirShipBuilder{
        @Override
        public Engine builderEngine() {
            System.out.println("构建发动机...");
            return new Engine("发动机");
        }
        @Override
        public OrbitalModule builderOrbitalModule() {
            System.out.println("构建轨道舱...");
            return new OrbitalModule("轨道舱");
        }
    
        @Override
        public EscapeTower builderEscapeTower() {
            System.out.println("构建逃逸塔...");
            return new EscapeTower("逃逸塔");
        }
    
    }
    package cn.taosir.design.create.builders;
    
    public class TaoSirAirShipDirector implements AirShipDirector{
    
        private AirShipBuilder builder;
    
        public TaoSirAirShipDirector(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;
        }
    
    }
    package cn.taosir.design.create.builders;
    
    public class Client {
        public static void main(String[] args) {
            AirShipDirector director=new TaoSirAirShipDirector(new TaoSirAirShipBuilder());
            AirShip ship = director.directAirShip();
            System.out.println(ship.getEngine());
        }
    }

    开发中的应用场景

    StringBuilder类的append方法

    SQL中的PreparedStatement

    JDOM中,DomBuilder、SAXBuilder

  • 相关阅读:
    Less的嵌套规则
    作为函数的mixin
    带参数的Mixin
    Less的Mixin
    Less变量
    sticky-css
    javascript copy 复制到粘贴板的方法
    Storage支持率记录
    cookie session 做登录认证
    vue2.x 微信浏览器中遇到的奇难杂症
  • 原文地址:https://www.cnblogs.com/it-taosir/p/10501837.html
Copyright © 2011-2022 走看看