設計モードせっけいもでる:構築モードさくせいもでる


原文住所:http://leihuang.org/2014/12/03/builder/
Creationalモード
物件の発生にはシステム資源を消費する必要があるため,いかに効率的に物件の発生,管理,操作を行うかは,常に議論に値する課題であり,Creationalモデルは物件の構築に関連しており,この分類下のモデルはいくつかの指導原則と設計の方向を与えている.以下に列挙するのはすべてCreationalモードに属する
  • Simple Factoryモード
  • Abstract Factoryモード
  • Builderモード
  • Factory Methodモード
  • Prototypeモード
  • Singletonモード
  • Registry of Singletonモード
  • 発生した問題
    The builder pattern is a good choice when designing classes whose constructors or static factories would have more than a handful of parameters.
    コンストラクション関数のパラメータが非常に多く、複数のコンストラクション関数がある場合、次のようになります.
    Pizza(int size) { ... } 
    Pizza(int size, boolean cheese) { ... } 
    Pizza(int size, boolean cheese, boolean pepperoni) {...} 
    Pizza(int size, boolean cheese, boolean pepperoni ,boolean bacon) { ... }

    This is called the Telescoping Constructor Pattern.次の解決策はjavabeanモードです.
    Pizza pizza = new Pizza(12);
    pizza.setCheese(true);
    pizza.setPepperoni(true);
    pizza.setBacon(true);

    Javabeans make a class mutable even if it is not strictly necessary.So javabeans require an extra effort in handling thread-safety(an immutable class is always thread safety!)
    構築モードこの問題を解決する
    <span style="font-weight: normal;">public class Pizza {
        //    
        private final int size;
    
        //      
        private boolean cheese;
        private boolean pepperoni;
        private boolean bacon;
    
        public static class Builder {
            // required
            private final int size;
    
            // optional
            private boolean cheese = false;
            private boolean pepperoni = false;
            private boolean bacon = false;
    
            //  size    ,            
            public Builder(int size) {
                this.size = size;
            }
    
            public Builder cheese(boolean value) {
                cheese = value;
                return this;
            }
    
            public Builder pepperoni(boolean value) {
                pepperoni = value;
                return this;
            }
    
            public Builder bacon(boolean value) {
                bacon = value;
                return this;
            }
    
            public Pizza build() {
                return new Pizza(this);
            }
        }
    
        private Pizza(Builder builder) {
            size = builder.size;
            cheese = builder.cheese;
            pepperoni = builder.pepperoni;
            bacon = builder.bacon;
        }
    }</span>
    Pizzaは現在immutable classなので、スレッドが安全です.また、Builder's setterメソッドごとにBuilderオブジェクトが返されるため、直列に呼び出すことができます.次のように
    Pizza pizza = new Pizza.Builder(12)
                           .cheese(true)
                           .pepperoni(true)
                           .bacon(true)
                           .build();

    以上から分かるように、構築モードは、ユーザーにより大きな自由を与え、任意のパラメータを選択することができる.
    2014-11-09 18:21:17
    Brave,Happy,Thanksgiving !