ビルダーモード
定義はジェネレーターパターンとも呼ばれます。複雑なオブジェクトの構築プロセス(要約カテゴリ)を抽象化できるため、この抽象プロセスの異なる実装方法は、異なる症状(属性)を持つオブジェクトを構築できます。
複雑なオブジェクトを作成するためのアルゴリズムがそのオブジェクトのコンポーネントとは独立している必要があり、構築プロセスにより、構築されたオブジェクトが異なる表現を持たせる必要があります。ビルダーモードの使用を検討する場合があります。
成し遂げる
1。ビルダー製品オブジェクトを作成する各コンポーネントの抽象インターフェイスを指定します。通常、製品を作成および返す抽象的な方法が含まれています。または、具体的な方法であり、作成プロセスをConcreteBuilderクラスに入れることができます。
2。コンクリートビルダーは、ビルダーインターフェイスを実装して、製品のさまざまなコンポーネントを構築および組み立てます。
3。ディレクターは、適切なビルダーに電話して製品を形成する責任があります。ディレクタークラスは通常、製品クラスに依存しません。ビルダークラスは、ディレクタークラスと直接対話します。
4。製品は、構築する複雑なオブジェクトを表します。 concreatebuilderは、製品の内部表現を作成し、アセンブリプロセスを定義します。
/ ** "Product"*/ class pizza {private string dough = "";プライベートストリングソース= "";プライベート文字列トッピング= ""; public void setdough(string dough){this.dough = dough; } public void setsauce(string sauce){this.sauce = sauce; } public void setopping(stringトッピング){this.topping = topping; }} ''/** "抽象ビルダー"*/''抽象クラスのピザのピザ{保護されたピザピザ; public pizza getpizza(){pizzaを返します。 } public void createNewpizzaproduct(){pizza = new Pizza(); } public Abstract void builddough();パブリックアブストラクトvoid buildsauce(); public abstract void buildtopping(); } / ** "ConcreteBuilder"* / class Hawaiianpizzabuilder拡張pizzabuilder {public void builddough(){pizza.setdough( "cross"); } public void buildsauce(){pizza.setsauce( "mild"); } public void buildtopping(){pizza.settopping( "ham+pineapple"); }} / ** "concreteBuilder"* / class spicypizzabuilder extends pizzabuilder {public void builddough(){pizza.setDough( "pan baked"); } public void buildsauce(){pizza.setsauce( "hot"); } public void buildtopping(){pizza.settopping( "pepperoni+salami"); }} ''/** "ディレクター"*/''クラスウェイター{private pizzabuilder pizzabuilder; public void setpizzabuilder(pizzabuilder pb){pizzabuilder = pb; } public pizza getpizza(){return pizzabuilder.getpizza(); } public void constructpizza(){pizzabuilder.createNewpizzaproduct(); pizzabuilder.builddough(); pizzabuilder.buildsauce(); pizzabuilder.buildtopping(); }} /**ピザを注文する顧客。 */ class builderexample {public static void main(string [] args){waiter waiter = new Waiter(); pizzabuilder hawaiian_pizzabuilder = new hawaiianpizzabuilder(); pizzabuilder spicy_pizzabuilder = new spicypizzabuilder(); waiter.setpizzabuilder(hawaiian_pizzabuilder); waiter.constructpizza(); Pizza Pizza = waiter.getpizza(); }}クライアントはディレクターオブジェクトを作成し、必要なビルダーオブジェクトで構成します。ディレクターは、製品を作成するための顧客の要求を取得し、最終的に製品を取得します。
アドバンテージ
1.オブジェクトを構築するプロセスは、さまざまな製品オブジェクトを生成するために慎重に制御できます。
2。拡張が簡単です。新しい製品がある場合は、新しいコンクリートビルダーを追加して達成できます。
関連パターン抽象的な工場パターンは、複雑なオブジェクトを作成できるため、ジェネレーターに似ています。主な違いは、ジェネレーターパターンが段階的に複雑なオブジェクトの構築に焦点を当てていることです。抽象的な工場モデルは、複数の一連の製品オブジェクトに焦点を当てています(シンプルまたは複雑)。
ジェネレーターは最後のステップで製品を返し、抽象工場の場合、製品はすぐに戻ります。
プロトタイプモード
プロトタイプパターンを定義することは、新しいインスタンスを作成するのではなく、新しいインスタンスを返すために既存のインスタンスを「コピー」することを特徴とする作成パターンの一種です。コピーされた例は、カスタマイズ可能な「プロトタイプ」と呼ばれるものです。
この場合、既存のインスタンスをコピーするとプログラムがより効率的に実行されるため、プロトタイプモードは主に複雑または時間のかかるインスタンスを作成するために使用されます。または、等しい値を作成し、異なる類似のデータに名前を付けるだけです。
成し遂げる
1。クライアント - 新しいオブジェクトを作成し、クローンを介して別のオブジェクトを取得します。
2。プロトタイプ - クローン独自の抽象的なメソッドを定義します。
3。ConcreTePrototype-クローン法を実装します。
public Interface Prototype {public Abstract object clone(); }パブリッククラスのconcreteprototypeはprototype {public object clone(){return super.clone(); }} public class client {public static void main(string arg []){concreteprototype obj1 = new concreteprototype(); concreTeprototype obj2 = concreteprototype)obj1.clone(); }}例
1.ゲーム内の多くの要素が繰り返され、プロトタイプモードを使用して同じ要素をコピーできます。
2.データチャートを作成するとき、データベースからデータを読み取り、オブジェクトに保存する必要があるのは初めてです。同じデータの他のチャートを作成する必要がある場合、プロトタイプモードを使用すると、データベースの読み取りを回避できます。
関連する質問と実装
1.作成するプロトタイプの数が修正されていない場合、プロトタイプマネージャーを作成できます。プロトタイプオブジェクトをコピーする前に、クライアントはまず、プロトタイプマネージャーの条件を満たすプロトタイプオブジェクトがあるかどうかを確認します。ある場合は、直接使用します。そうでない場合は、1つをクローンします。これは、プロトタイプモードの登録フォームと呼ばれます。
2。コピーには、ディープコピーと浅いコピーの2種類があります。コピーするとき、コピーオブジェクトとプロトタイプオブジェクトは、オブジェクトのすべての内部変数を共有し、2つのオブジェクトには同じメモリ空間とライフサイクルがあります。プロトタイプオブジェクトの変更もレプリカを変更し、逆も同様です。
Javaでは、クローン可能なインターフェイスを実装する限り、オブジェクトクラスのクローンメソッドを呼び出して、浅いコピーを実現できます。
パブリッククラスの浅いクローンはクローン可能{int age;人の人; public void Setage(int age){this.age = age; } public void setPerson(string name){person = new person(name); } public object clone()throws clonenotsuptedexception {//デフォルトのjavaは浅いコピーreturn super.clone()を実装します。 }} public class person {string name;パブリックパーソン(文字列名){this.name = name; }} public class test {public static void main(string [] args)throws clonenotsuptedexception {shallowclone oldshallowclone = new shallowclone(); OldShallowClone.Setage(20); Oldshallowclone.setperson( "eric"); System.out.println( "oldname:" + oldshallowclone.person.name + "age:" + oldshallowclone.age); shallowclone newshallowclone =(shallowclone)oldshallowclone.clone(); System.out.println( "NewName:" + newShallowClone.Person.Name + "age:" + newShallowClone.age); oldshallowclone.age = 30; oldshallowclone.person.name = "frank"; System.out.println( "NewName:" + newShallowClone.Person.Name + "age:" + newShallowClone.age); }}出力:
oldname:Eric Age:20NewName:Eric Age:20NewName:Frank Age:20
オブジェクトのコピーがオブジェクトへの参照であることがわかります。オブジェクトの値が変更されると、コピーされたオブジェクトも変更され、Javaの基本的なタイプがコピーされた値です。
以下にディープコピーを実装してください。
パブリッククラスのdeepclone {int age;人の人; public void Setage(int age){this.age = age; } public void setPerson(string name){person = new person(name); } public deepclone(deepclone deepclone){this.age = deepclone.age; this.person = new person(deepclone.person.name); } public deepclone(){} public object clone()throws clonenotsupportedexception {return new deepclone(this); }} public class test {public static void main(string [] args)throws clonenotsuptedexception {deepclone olddeepclone = new DeepClone(); OldDeepClone.Setage(20); olddeepclone.setperson( "eric"); System.out.println( "oldname:" + olddeepclone.person.name + "age:" + olddeepclone.age); deepclone newdeepclone =(deepclone)olddeepclone.clone(); System.out.println( "newName:" + newDeepClone.Person.Name + "age:" + newDeepClone.age); olddeepclone.age = 30; olddeepclone.person.name = "frank"; System.out.println( "newName:" + newDeepClone.Person.Name + "age:" + newDeepClone.age); }}出力:
oldname:Eric Age:20NewName:Eric Age:20NewName:Eric Age:20
上記のコピー方法では、オブジェクトを再作成し、ディープコピーを実装するための参照を再作成しました。
アドバンテージ
1。コピーは新品よりも優れています。
2.オブジェクトの作成の詳細を簡素化または非表示にし、直接コピーします。