小さなケーススタディ
1、機能要件:
掘り基礎、壁、天井:今、私たちは、プロセスを構築し、家を構築する必要があります。異なる達成するための異なる家屋の種類(建物、別荘)、同じプロセスであるが、しかし、特定の機能のために。どのように家を建てるには?
2、鶏肉料理の答え:
(1)抽象インターフェースを定義し、3つの抽象メソッド(掘削基礎、壁、天井)を定義します。
(2)住宅の異なるタイプのインターフェイスを実装し、オーバーライドに関連する方法。
(3)コードの実装:
パッケージbuilder.pattern; / ** *テストクラス * * / パブリック クラスBuilderDemo { 公共の 静的な 無効メイン(文字列[] args)を{ System.out.printlnは( "建てヴィラのプロセス:" ); BuilderHouseヴィラ = 新しい新しいヴィラ() ; のSystem.out.println( "\ nは高層ビル処理" ); BuilderHouse highBuild = 新しい新しいHighBuild(); } } / ** *インターフェースを構築し家を定義し、プロセスを定義 * / 界面BuilderHouse { ボイド scoopHole() ; // 掘る財団 空 buildWall(); // 壁 ボイドトップオフ(); // キャップ } / ** *建てのヴィラ、インタフェースを実現するために家を建てるために * * / クラスヴィラ実装BuilderHouse { / ** *ホーム構築プロセス * / 公共ヴィラ( ){ scoopHole(); buildWall(); トップオフ(); } @Override 公共 ボイドscoopHole(){ System.out.printlnは( "地面10メートル掘る" ); } @Override 公共 ボイド)buildWallを({ のSystem.out.println(「パズル10階建ての壁」); } @Override 公共 ボイドトップオフ(){ System.out.printlnは( "屋根のプールを構築する" ); } } / ** *高層ビルプロセス、家を建てるためのインタフェースの実装 * * / クラスは HighBuild 実装をBuilderHouse { / ** *高層ビルのプロセス * / パブリックHighBuild(){ ; scoopHole() ; buildWall() トップオフ(); } @Override 公共 ボイドscoopHole(){ のSystem.out.printlnは、(「30メートル掘ります財団" ); } @オーバーライド 公共 ボイドbuildWall(){ System.out.printlnは( "パズル壁層60" ); } @Override 公共 ボイドトップオフ(){ System.out.printlnは( "屋根建設エプロン" ); } }
(4)解析コード:
理解し、操作しやすいのが、プログラムの拡張が良好ではなく、結合強度(製品及びプロセスのが一緒に包装された製品を作成します)。
(5)UML図。
第二に、Builderパターン
1. Builderパターンとは何ですか
異なる構成を実現するために、抽象オブジェクトとそのサブクラスの建設プロセスを複雑と呼ばれる発電機モード、。ユーザーがどれだけ内部の管工事の実装の詳細に必要はありませんが、ライン上で呼び出す必要があります。理解するのは簡単です、部品の山は、全体を構成し、一部はライン上で組み立てることができ、ユーザーの一部が形成される方法を制御していない、実装に異なるサブクラスによって、抽象的です。
2、コアロールモデルビルダー
(1)製品(商品):コンクリート製品のオブジェクト。
(2)抽象ビルダー(ビルダー)インタフェースまたは抽象クラス、様々な部品の内部で生成された製品定義された抽象メソッドを定義します。
(3)具体的なビルダー(ConcreateBuilder)インタフェースを実装し、各パートの生成方法オーバーライドします。
(4)アセンブラ(コマンダー):プロセスは、スプライシング部分に従って、オブジェクトを返します。
(5)コードの実装:
パッケージbuilder.pattern。 / ** *测试类 * * / パブリック クラスBuilderDemo { 公共 静的 ボイドメイン(文字列[]引数){ するSystem.out.println( "建别墅流程:" )。 HouseBuilder villaBuilder = 新しいVillaBuilder(); HouseCommandar villaCommandar = 新しいHouseCommandar(villaBuilder)。 System.out.println(villaCommandar.createHouse())。 System.out.println( "\ nは建高楼流程" ); HouseBuilder highBuildBuilder = 新しいHighBuildBuilder(); HouseCommandar highBuildCommandar = 新しいHouseCommandar(highBuildBuilder)。 System.out.println(highBuildCommandar.createHouse())。 } } / ** *产品类 * * / クラスハウス{ プライベート文字列の基礎; プライベート文字列の壁。 プライベート文字列の屋根。 パブリック文字列getBasis(){ 戻り基づい。 } 公共 ボイドsetBasis(文字ベース){ この .basis = 基づい; } パブリック文字列getWall(){ 戻りウォール; } 公共 ボイドsetWall(文字列壁){ この .wall = ウォール; } パブリック文字列getRoof(){ 戻り屋根; } 公共 ボイドsetRoof(文字列屋根){ この .roof = ルーフ; } @Override パブリック文字列のtoString( ){ リターン "ハウス[ベーシス="基本+ + "ウォール=" + +壁"屋根=" +ルーフ+ "]" ; } } / ** *抽象ビルダー、内部の製品コンポーネントを各抽象生成定義方法。 * * / 抽象 クラス{Housebuilder ハウスハウス = 新新・ハウス(); 公共の 抽象 無効 scoopHole(); // 掘り パブリック 抽象 無効 buildWall(); // 壁 パブリック 抽象 ボイドトップオフ(); // キャップ パブリックハウスgetHouse(){ 返すハウス; } } / ** *詳細なビルダー、ヴィラを構築する、抽象クラスを継承し、および関連する方法オーバーライド * * / クラス VillaBuilder 延びhousebuilder { @Override 公共 ボイドscoopHoleを(){ house.setBasis( "地上10メートル掘る" ); } @Override 公共 ボイドbuildWall(){ house.setWall( "パズル壁層10" ); } @Override 公共 ボイドトップオフ(){ house.setRoof(「屋根建設プール" ); } } / ** *高層ビルプロセス、家を建てるためのインタフェースを実装する * * / クラス HighBuildBuilder 拡張housebuilder { @Override 公共 のボイドscoopHoleは(){ house.setBasis( " "30メートルの基礎を掘ります); } @オーバーライド 公共 ボイドbuildWall(){ house.setWall( "パズル壁層60" ); } @Override 公共 ボイドトップオフ(){ house.setRoof( "屋根建設エプロン" ); } } / ** *アセンブラ、流量制御コンポーネントの組み合わせ、および製品のオブジェクトを戻す * / クラスHouseCommandar { プライベートhousebuilderのhousebuilder; / ** *特定のビルダーのため * / パブリックHouseCommandar(housebuilderのhousebuilder){ この .houseBuilder = housebuilder; } / ** *制御構成部屋の過程、および家のインスタンスを返します * * @return 房子实例 * / パブリックハウスcreateHouse(){ houseBuilder.scoopHole()。 houseBuilder.buildWall(); houseBuilder.topOff(); 返すhouseBuilder.getHouseを(); } }
(6)コード分析:
コードから出てくる生成物の流れを制御する前の実施形態と比較すると。ある程度、製品および製品分離するようにプロセスを構築するデカップリングするように。延長コードは、単にHouseBuilderを継承した場合に関連する方法は書き換えることができます。
(7)UMLダイアグラム。
3、Abstract Factoryパターンとビルダーモードの違い
(1)Abstract Factoryパターンは、別の工場に基づいてオブジェクトを作成することです。
(2)ビルダーは、オブジェクトを組み立てる流れパターンです。
三、JDKのソースコード解析(のStringBuilder)
図1に示すように、ソースコードの一部
パブリック 最終 クラスは、 StringBuilderの延び AbstractStringBuilder 実装たjava.io.Serializable、たCharSequence { } 抽象 クラス AbstractStringBuilder 実装追加可能で、たCharSequence { //は内部メソッドのセットを定義し、AbstractStringBuilderいくつかのメソッドの戻り型 公共追記AbstractStringBuilder(文字列STR){ IF(STR == NULL ) を返す; appendNull() INT LEN = str.length(); ensureCapacityInternal(COUNT + LEN)を、 str.getChars( 0、LEN、値、カウント); カウント = + LEN。 返す これを。 } 公共 AbstractStringBuilder deleteCharAt(int型のインデックス){ 場合((インデックス<0)||(インデックス> = カウント)) スロー 新しいStringIndexOutOfBoundsExceptionを(インデックス)。 System.arraycopyの(値、インデックス +1、値、インデックス、インデックス-1カウント)。 カウント - ; 返す これを。 } }
図2に示すように、ソースコード解析
AbstractStringBuilder戻り値の型の内部AbstractStringBuilderメソッドのセットを定義し、これらの方法は、チェーンコール(製品ビルドプロセス)を形成し、最後に呼び出しチェーンに係る組オブジェクトに戻すために組み合わせることができます。
それStringBuilderのは、特定のビルダーを組み立てます。抽象ビルダーAbstractStringBuilder。