コンストラクタモード(製品をカプセル化する構築プロセス)

4712 ワード

ソースアドレス
https://github.com/DingMouRen/DesignPattern
定義#テイギ#
コンストラクタモードでは、複雑なオブジェクトのコンストラクションをその表現から分離し、同じコンストラクションプロセスで異なる表現を作成できます.
シーンの操作
  • 同じ方法で、異なる実行順序で、異なるイベント結果が生成される.
  • 当初はオブジェクトが開始され、必要なパラメータが比較的多い場合、デフォルト値を持つパラメータもあります.

  • くりを一つあげる
    複雑なオブジェクトの構築に属する多くのパラメータを必要とする契約オブジェクトを作成します.
    /**
     * Created by dingmouren on 2017/8/16.
     * email:[email protected]
     *       
     */
    
    public class InsuranceContract {
        private String contractid;
        private String personName;
        private String companyName;
        private long beginDate;
        private long endDate;
        private String otherData;
    
        /**
         *   Builder      
         *
         * @param builder
         */
        private InsuranceContract(ConcreteBuilder builder) {
            this.contractid = builder.getContractid();
            this.personName = builder.getPersonName();
            this.companyName = builder.getCompanyName();
            this.beginDate = builder.getBeginDate();
            this.endDate = builder.getEndDate();
            this.otherData = builder.getOtherData();
        }
    
        /**
         *            
         */
        public void showInfo() {
            System.out.println("         :......");
        }
    
        /**
         * Created by dingmouren on 2017/8/16.
         * email:[email protected]
         *             
         */
        public static class ConcreteBuilder {
            private String contractid;
            private String personName;
            private String companyName;
            private long beginDate;
            private long endDate;
            private String otherData;
    
            /**
             *               
             *
             * @param contractid       
             * @param beginDate          
             * @param endDate          
             */
            public ConcreteBuilder(String contractid, long beginDate, long endDate) {
                this.contractid = contractid;
                this.beginDate = beginDate;
                this.endDate = endDate;
            }
    
    
    
            //          ,        
            public ConcreteBuilder setPersonName(String personName) {
                this.personName = personName;
                return this;
            }
    
            public ConcreteBuilder setCompanyName(String companyName) {
                this.companyName = companyName;
                return this;
            }
    
            public ConcreteBuilder setOtherData(String otherData) {
                this.otherData = otherData;
                return this;
            }
    
            /**
             *           
             *
             * @return       
             */
            public InsuranceContract build() {
    
                //        
                if (contractid == null || contractid.trim().length() == 0) throw new IllegalArgumentException("        ");
    
                //              , build         
                boolean signPerson = personName != null && personName.trim().length() > 0;
                boolean signCompany = companyName != null && companyName.trim().length() > 0;
    
                if (signCompany && signPerson) throw new IllegalArgumentException("               ");
                if (signCompany == false && signPerson == false) throw new IllegalArgumentException("            ");
                if (beginDate <= 0) throw new IllegalArgumentException("             ");
                if (endDate <= 0) throw new IllegalArgumentException("           ");
                if (endDate <= beginDate) throw new IllegalArgumentException("                 ");
    
                return new InsuranceContract(this);
            }
    
            //     getter       ,    setter   
    
    
            public String getContractid() {
                return contractid;
            }
    
            public String getPersonName() {
                return personName;
            }
    
            public String getCompanyName() {
                return companyName;
            }
    
            public long getBeginDate() {
                return beginDate;
            }
    
            public long getEndDate() {
                return endDate;
            }
    
            public String getOtherData() {
                return otherData;
            }
        }
    }
    
    

    使用
     public static void main(String[] args) {
            InsuranceContract.ConcreteBuilder builder = new InsuranceContract.ConcreteBuilder("001",1100L,1199L);
            InsuranceContract contract = builder.setCompanyName("    ")
                    .setPersonName("  ")
                    .setOtherData("    ")
                    .build();
            contract.showInfo();//        
        }
    

    まとめ
    メリット
  • は、クライアントが製品内部の構成の詳細を知る必要がないように、ビルダーモードによって良好にパッケージ化されている
  • .
  • 構築者は独立しており、拡張しやすい.欠点
  • は余分なBuilderオブジェクトを生成し、メモリ
  • を消費する.
    以上のビルダーパターンはAndroidでよく使われていますが、一般的なビルダーパターンとは少し違います.