Java 23種類のデザインモデル(GOF)――ビルダーモデル


コンストラクタモード
  • シーン
  • 本質
  • ケース
  • 開発シーン
  • シーン
    複雑な製品を作る必要があります.例えば、潜水艦、携帯電話は、この製品を建造する過程で1つの問題を処理する必要があります:これらのサブコンポーネントを組み立てるにはステップの問題がありますか?実際の開発では,我々が必要とするオブジェクトを構築する際にも非常に複雑であり,処理する必要があるステップが多い.
    本質
  • は、オブジェクトサブアセンブリの個別の構造(Builderが担当)とアセンブリ(Directorが担当)を分離します.これにより、複雑なオブジェクトを構築できます.このモードは、オブジェクトの構築プロセスが複雑な場合に使用できます.
  • は、構築およびアセンブリのデカップリングが実現されたためである.異なるコンストラクタ、同じアセンブリ、異なるオブジェクトを作成することもできます.同じコンストラクタでは、異なるアセンブリ順序で異なるオブジェクトを作成できます.すなわち,構築アルゴリズム,アセンブリアルゴリズムのデカップリングを実現し,より良い多重化を実現した.

  • ケース
    public class OrbitalModule{
        private String name;
    
        public OrbitalModule(String name) {
            this.name = name;
        }
    	//   getter   setter  
    }
    
    public class EscapeTower {
        private String name;
    
        public EscapeTower(String name) {
            this.name = name;
        }
        //  getter   setter  
    }
    
    public class Engine {
        private String name;
    
        public Engine(String name) {
            this.name = name;
        }
    	//   getter   setter  
    }
    
    public class AirShip {
        private OrbitalModule orbitalModule;//   
        private Engine engine;//   
        private EscapeTower escapeTower;//   
    
        public void launch(){
            System.out.println("  !");
        }
    	//   getter   setter  
    }
    
    public interface AirShipBuilder {
        Engine builderEngine();
        OrbitalModule builderOrbitalModule();
        EscapeTower builderEscapeTower();
    }
    
    public interface AirShipDirector {
        /**
         *       
         * @return
         */
        AirShip directorAipShip();
    
    }
    
    public class AirShipBuilderImpl 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("^   ^");
        }
    }
    
    public class AirShipDirectorImpl implements AirShipDirector {
    
        private AirShipBuilder builder;
    
        public AirShipDirectorImpl(AirShipBuilder builder) {
            this.builder = builder;
        }
    
        @Override
        public AirShip directorAipShip() {
            Engine engine = builder.builderEngine();
            EscapeTower escapeTower = builder.builderEscapeTower();
            OrbitalModule orbitalModule = builder.builderOrbitalModule();
    
            //      
            AirShip ship = new AirShip();
            ship.setEngine(engine);
            ship.setEscapeTower(escapeTower);
            ship.setOrbitalModule(orbitalModule);
            return ship;
        }
    }
    
    public class Test01 {
        public static void main(String[] args) {
            AirShipDirector director = new AirShipDirectorImpl(new AirShipBuilderImpl());
            AirShip ship = director.directorAipShip();
            System.out.println(ship.getEngine().getName());
            System.out.println(ship.getEscapeTower().getName());
            System.out.println(ship.getOrbitalModule().getName());
            ship.launch();
        }
    }
    

    開発シーン
  • StringBuilderクラスにおけるappendメソッド
  • SQLのPreparedStatement
  • JDOM中、DomBuilder、SAXBuilder