ビルダー:複雑なオブジェクトの構築を表現から分離して、同じ構造プロセスが異なる表現を作成できるようにします。
シナリオを使用してください:
一般クラス図:
たとえば、デスクトップコンピューターなど、私たちの生活の多くのデバイスがアセンブリ形式で存在します。一部のメーカーは、デフォルトの構成を備えたいくつかの組み立てられたコンピューターホストを起動します(ここではテンプレートメソッドモードを使用できます)。顧客は、デフォルトの構成を備えた製品を購入することも、メーカーに異なる構成とアセンブリ方法でホストを再組み立てするように依頼することもできます。この時点で、ビルダーモデルを使用して、特別な顧客の要件を満たすことができます。
この例では、メーカーはホストを再組み立てしていることに注意してください。つまり、ホストの各コンポーネントに焦点が当てられていることに注意してください。これは、上記のビルダーモードで与えられた使用シナリオに沿っています。
単純なコードの実装は次のとおりです。
//抽象製品クラス、テンプレートメソッドモードを使用して、異なる製品には異なる「コンポーネントパーツ」要約クラスAbstractProduct {Protected Abstract void Part01();保護された抽象void part02();保護された抽象void part03(); //テンプレートメソッドは、デフォルトのアセンブリメソッドを指定し、デフォルトの製品パブリックabstractProduct defaultProduct()を生成します{part01(); PART02(); part03();これを返します; //現在のオブジェクト、つまりデフォルトのアセンブリメソッドを備えた製品を返します}} //特定の製品aおよびb、異なる製品を実装します。 } protected void part02(){system.out.println( "product a:part02()..."); } protected void part03(){system.out.println( "product a:part03()..."); }} class concreteproductb extends abstractproduct {protected void part01(){system.out.println( "product b:part01()..."); } protected void part02(){system.out.println( "product b:part02()..."); } protected void part03(){system.out.println( "製品B:PART03()..."); }} //要約ビルダーは、各製品がbuildPart()を実装する必要がある組み合わせ方法を策定します。パブリックアブストラクトアブストラクトプロダクトbuildproduct(); } / * *特定のビルダーがデフォルトの製品に満足していない場合(つまり、抽象製品のデフォルトプロダクト()メソッドが呼び出された場合)、 *製品の生産とアセンブリ方法を使用するために特定のビルダーを使用して、さまざまな製品を取得するために特定のビルダーを使用することはできません。 public void buildpart(){this.producta.part03(); this.producta.part02(); this.producta.part01(); } public AbstractProduct buildproduct(){return this.producta; }} class concreteBuilderb extends abstractBuilder {private abstractproduct productb = new ConcreTeproductb(); public void buildpart(){this.productb.part02(); this.productb.part01(); //製品Bの1つのコンポーネントは省略されています。たとえば、このパートの関数は顧客には必要ありません// this.productb.part03(); } public AbstractProduct BuildProduct(){return this.productb; }} //ディレクタークラス、各製品を事前にホールドするビルダーは、デフォルトの製品クラスディレクターとは異なる製品を必要とするユーザーに異なるアセンブリメソッドを提供します{private abstractbuilder builda = new ConcreteBuildera(); private abstractBuilder buildb = new ConcreteBuilderb(); public AbstractProduct getProducta(){this.buildera.buildpart(); this.buildera.buildproduct()を返します。 } public AbstractProduct getProductb(){this.builderb.buildpart(); this.builderb.buildproduct()を返します。 }} //テストクラスパブリッククラスクライアント{public static void main(string [] args){system.out.println( "テンプレートメソッドモードを使用してデフォルトの製品a"); AbstractProduct defaultProducta = new ConcreTeproducta()。defaultProduct(); System.out.println( "/nuse director class fous fource direct a ainted firt incernal Assembly Method");ディレクターディレクター=新しいディレクター(); director.getProducta(); System.out.println( "/nuse director class fous fource bout bed with Assembly Method"); director.getProductb(); }}テスト結果:
テンプレートメソッドモードを使用して、デフォルトの製品を取得します
製品A:PART01()...
製品A:PART02()...
製品A:PART03()...
ディレクタークラスを使用して、異なる組み立て方法を持つ製品を取得する
製品A:PART03()...
製品A:PART02()...
製品A:PART01()...
ディレクタークラスを使用して、異なるアセンブリ方法で製品Bを取得する
製品B:Part02()...
製品B:Part01()...
実際、この例では、製品カテゴリでは、前の記事で述べたテンプレートメソッドモードを使用しています。つまり、DefaultProduct()は、製品のデフォルトコンポーネントを組み立てる方法を提供します。
しかし、私はここに質問があります。テンプレートメソッドパターンに基づいてAbstractProductクラスで提供されるいわゆるデフォルトアセンブリメソッドは、いくつかのテスト文を印刷するためだけであり、特定の製品を実際には返しません。ただし、上記の例で現在のオブジェクトを返す処理方法(これを返します)が合理的かどうかはわかりません。
さらに、Javaコードでデザインパターンの実装に関するこれらの記事を書いた後、このビルダービルダーパターンが抽象的な工場パターンとテンプレートメソッドパターンを組み合わせているように見えることがわかりました。上記の段落はすでに私の疑問について言及しています。抽象的な工場モデルについては、上記のコード例のディレクタークラスは抽象工場の特定の工場クラスと非常に似ていると個人的に考えていますが、ディレクタークラスは製品を返す前に製品アセンブリ法を構築する必要があります。おそらく、ビルダーモデルが製品のさまざまな部分のアセンブリに焦点を合わせるのはこの「ビルド」であり、抽象的な工場モデルは最終製品の生成にのみ焦点を当てています。
私は以前に文を読んだことがあり、それは大まかに言われていると言いました:コンピューターの問題を解決が困難な場合、中間層を追加することで処理できます。今考えてみると、抽象工場とビルダーモードの両方がこの「原理」を使用して、望ましい効果を達成するようです。たとえば、抽象工場には抽象的な工場クラスがあり、ビルダーにはディレクタークラスがあります。最終分析では、特定の詳細をカプセル化して非表示にし、実装と使用から切り離すことです。
これらをよりよく把握する前に、最初に各モデルの懸念と適用可能なシナリオを理解しなければならないと思います。
これらのモードはすべて創造的なモードであり、実際の経験はありません。それはこれらについて少し混乱しています...私は恐れていません。それらすべてを実装する過程で少し考え、それらをゆっくりと現実に適用することは徐々に理解されるはずです。
上記はすべてこの記事に関するものであり、それがあなたに学ぶように促すことを願っています。