モデルの定義と特性
ビルダー(ビルダー)モードの定義:同じ構成プロセスは、このような、異なる表現を作成することができるように、複雑なオブジェクトとその表現分離の構造を意味するデザインパターンは、 Builderパターンと呼ばれます。それは、単純な複数のオブジェクトに複雑なオブジェクトであり、段階的に構築されます。これは、製品の一部は同じですが、各部分が選択の柔軟性であること、変装単離されていないになります。
次のようにこのモードの主な利点は次のとおりです。
- それぞれの具体的なビルダーが独立している、それはシステムの拡張を助長しています。
- クライアントは、リスクの詳細を制御しやすく、製品の内部構成の詳細を知る必要はありません。
次のような欠点は次のとおりです。
- 製品の一部は、その使用が制限され、同じでなければなりません。
- 製品の複雑における内部変化した場合、モデルがたくさんにビルダーのカテゴリが増加します。
フォーカスビルダー(ビルダー)モード、工場パターン異なる:ビルダーモデルは部品の組立工程に着目し、ファクトリメソッドパターンパーツを作成するプロセスに支払うもっと注意をするが、両方を組み合わせることができます。
アーキテクチャと実装モデル
ビルダー(ビルダー)モードでは、製品、抽象ビルダー、コンクリートビルダー、指揮官の4つの要素で構成され、そして今、私たちは基本的な構造と実装を分析する必要があります。
1.構造モデル
ビルダー(ビルダー)モードの主な役割は次の通りです。
- 製品の役割(製品):これは、複数のコンポーネントが含まれている複雑なオブジェクトであり、特にビルダーによって、そのさまざまなコンポーネントを作成するオフ。
- 抽象ビルダー(ビルダー):これは抽象メソッドであり、典型的には、複雑な製品の処理に戻るのgetResult()を含む、製品インタフェースの様々なサブコンポーネントを作成することを含みます。
- 特定ビルダー(コンクリートビルダ):インタフェースビルダー実現は、複雑な製品の様々な構成要素を作成する具体的な方法を達成します。
- ディレクター(監督):それは、複雑なオブジェクトを作成するオブジェクトビルダ部構造およびアセンブリのメソッドを呼び出し、誰がコマンドで特定の製品を伴わなかったこと。
図1に示す構造。
図1は、Builderパターンの構成図です。
実現の2モード
図1に示す主構造ビルダー(ビルダー)モードで次のように、関連するタイプのコードです。
(1)製品の役割:構成部品の複数を含む複雑なオブジェクト。
クラス製品 { プライベート文字列partA。 プライベート文字列partB。 プライベート文字列partC。 公共のボイドsetPartA(文字列partA) { this.partA = partA。 } 公共のボイドsetPartB(文字列partB) { this.partB = partB。 } 公共のボイドsetPartC(文字列partC) { this.partC =政党。 } ます。public voidショー() { //製品の特性を表示します } }
(2)要約ビルダー:各サブコンポーネントの生成物を含む抽象メソッドを作成します。
抽象クラスビルダ { //製品のターゲットを作成します 保護された製品の製品=新製品(); 公共の抽象無効buildPartA(); 公共の抽象無効buildPartB(); 公共の抽象無効buildPartC(); //製品オブジェクトを返します。 公共の製品のgetResult() { 製品を返します。 } }
(3)特定のビルダー:ビルダー抽象インタフェースを実現します。
パブリッククラスConcreteBuilderは、ビルダーを拡張します { ます。public void buildPartA() { product.setPartA( "ビルドPartA"); } ます。public void buildPartB() { product.setPartA( "ビルドPartB"); } ます。public void buildPartC() { product.setPartA( "建造PartC"); } }
(4)取締役:メソッド呼び出しは、複雑なオブジェクトを作成するためのビルダーを終了しました。
クラスディレクター { プライベートビルダービルダー; 公共ディレクター(ビルダービルダー) { this.builder =ビルダー; } //製品建設および組立方法 公共製品構築物() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); リターンbuilder.getResult(); } }
(5)顧客のクラス。
パブリッククラスクライアント { 公共の静的な無効メイン(文字列[] args) { ビルダービルダー=新しいConcreteBuilder(); ディレクターディレクター=新しいディレクター(ビルダー)。 製品産物= director.construct()。 product.show(); } }
応用例のモード
[実施例1]ビルダー(ビルダー)モードの説明リビングルームの装飾を持ちます。
分析:部屋の装飾を生きていることは、壁の装飾、テレビ、ソファの購入やレイアウトの選択を含む複雑なプロセスです。リノベーションのプロジェクトマネージャを必要とする、プロジェクトマネージャは、ステップの改修により、リフォームの労働者の段階、装飾を指揮し、全体のリビングルームのレイアウトを確定、それはビルダーパターンによって実現のより適切な例である顧客に知らせます。
ここでは、壁、テレビとソファのコンポーネントを含むリビングルームの製品は、です。具体的な改築の労働者は、彼らがソファの装飾や壁、テレビやレイアウトを担当している、特定のビルダーです。プロジェクトマネージャは、彼がデコレータの改修を指示するための責任があった、ディレクターです。
また、リビングルームには、クラスのshow()メソッドを提供しています、リフォームのレンダリングを表示することができます(画像のリノベーションレンダリングをダウンロードするにはここをクリックしてください)。クライアントプログラムReadXmlの説明改修プログラムは、プロジェクトマネージャーの改修を呼び出して、オブジェクトのクラスによって生成されたXML設定ファイルを(XMLファイルをダウンロードするにはこちらをクリック)のデータを読み込みます。クラス図は、図1に示します。
リビングルームの装飾の図2のブロック図
コードは以下の通りであります:
ビルダーをパッケージ化。 インポート持つjava.awt。*; インポートするjavax.swing。*; パブリッククラスParlourDecorator { 公共の静的な無効メイン(文字列[] args) { 試します { デコレータD; D =(デコレータ)ReadXML.getObject(); ProjectManager M =新ProjectManager(D)。 パーラーP = m.decorate()。 p.show(); } キャッチ(例外e) { System.out.println(e.getMessage())。 } } } //产品:客厅 class Parlour { private String wall; //墙 private String TV; //电视 private String sofa; //沙发 public void setWall(String wall) { this.wall=wall; } public void setTV(String TV) { this.TV=TV; } public void setSofa(String sofa) { this.sofa=sofa; } public void show() { JFrame jf=new JFrame("建造者模式测试"); Container contentPane=jf.getContentPane(); JPanel p=new JPanel(); JScrollPane sp=new JScrollPane(p); String parlour=wall+TV+sofa; JLabel l=new JLabel(new ImageIcon("src/"+parlour+".jpg")); p.setLayout(new GridLayout(1,1)); p.setBorder(BorderFactory.createTitledBorder("客厅")); p.add(l); contentPane.add(sp,BorderLayout.CENTER); jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //抽象建造者:装修工人 abstract class Decorator { //创建产品对象 protected Parlour product=new Parlour(); public abstract void buildWall(); public abstract void buildTV(); public abstract void buildSofa(); //返回产品对象 public Parlour getResult() { return product; } } //具体建造者:具体装修工人1 class ConcreteDecorator1 extends Decorator { public void buildWall() { product.setWall("w1"); } public void buildTV() { product.setTV("TV1"); } public void buildSofa() { product.setSofa("sf1"); } } //具体建造者:具体装修工人2 class ConcreteDecorator2 extends Decorator { public void buildWall() { product.setWall("w2"); } public void buildTV() { product.setTV("TV2"); } public void buildSofa() { product.setSofa("sf2"); } } //指挥者:项目经理 class ProjectManager { private Decorator builder; public ProjectManager(Decorator builder) { this.builder=builder; } //产品构建与组装方法 public Parlour decorate() { builder.buildWall(); builder.buildTV(); builder.buildSofa(); return builder.getResult(); } }
package Builder; import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; class ReadXML { public static Object getObject() { try { DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=dFactory.newDocumentBuilder(); Document doc; doc=builder.parse(new File("src/Builder/config.xml")); NodeList NL = doc.getElementsByTagName( "クラス名")。 ノードclassNode = nl.item(0).getFirstChild(); 文字列CNAME = "ビルダー。" + classNode.getNodeValue(); System.out.println( "新しいクラス名:" + CNAME)。 クラスC = Class.forNameの(CNAME)<?>; オブジェクトOBJ = c.newInstance()。 OBJ返します。 } キャッチ(例外e) { e.printStackTrace(); ヌルを返します。 } } }図3に示されるプログラムの結果。
図3リビングルームの装飾の営業成績
シーンモードの応用
ビルダー(ビルダー)モードでは、自社製品のさまざまな部分がしばしば劇的な変化に直面している、複雑なオブジェクトを作成するには、それは多くの場合、以下の状況で使用されているので、それらを組み合わせたアルゴリズムは、比較的安定しています。
- 複数の部材から構成されるより複雑なオブジェクトを作成し、複雑な変化に直面して、各メンバーが、構成の順序は、メンバー間安定です。
- 複雑なオブジェクトをオブジェクトとその組立方法、すなわち、アルゴリズムの独立したコンポーネントを作成、構築プロセスおよび最終生成物は、独立した表現です。
拡張モード
アプリケーションプロセスで必要とされるビルダー(ビルダー)モードでは、製品カテゴリは一つだけ、一つだけ特定のビルダーを作成した場合、その後、あなたは抽象的なビルダーを省略することができ、さらには省略司令官の役割から、変更することができます。