ビルダーモード
モードはそれをクライアントが複雑なオブジェクトの集合部の内部コンポーネントを知っている必要はありませんが、複数のコンポーネントを分離含まれている複雑なオブジェクトを持つクライアントを作成するプロセス、スキーマを作成することが最も複雑であるビルダー、唯一のビルダーの種類を知っておく必要がありますそれはすることができます。
モードモチベーション
Builderパターンは、我々はユーザーに完全な製品の件名に戻ることができ、その一部を含む複雑なオブジェクトを作成するために使用されます。ユーザーは単に、完全なオブジェクトが良いを作成するために使用することができます直接、詳細を作成し、内部のプロセスを知っている必要はありません。等自動車のホイール、ステアリング、送信、等の様々な構成要素を有し、ユーザはほとんど単一の部材が、完全な車の使用を使用しません。ソフトウェア開発車のような複雑なオブジェクトもありますが、彼らはメンバーの一連のプロパティを持っており、いくつかの制限があるかもしれません。
スキーマ定義
これは、同一のビルドプロセスが異なる表現を作成することができるように、構築物および複合オブジェクトのその分離を表します。Builderパターンは、ユーザーがタイプと内容を指定することにより、複雑なオブジェクトを構築することができ、複雑なオブジェクトを作成するためのステップバイステップであり、ユーザーが特定の詳細の内部構造を知る必要はありません。
モード構造
ビルダー(抽象ビルダー)
各メンバーに対して指定製品が抽象インタフェースオブジェクトを作成し、複雑なオブジェクトを作成するために、それぞれのコンポーネントのための方法buildPartX();のgetResult別の方法は、()複合オブジェクトを返します。
ConcreteBuilder(特定ビルダー)
具体的なビルダーは、作成Builderのインターフェース、部品の集合体の構造と方法、および複雑なオブジェクトの明確な定義を達成するため、それはまた、良い製品の複雑さを作成するには、オブジェクトを返すメソッドを提供することができます。
製品(製品の役割)
生成物は、特に、製品の内部の構成は、その組立工程を表し、定義作成し、構成部品を複数備え、複雑なキャラクタオブジェクトが構築されています。
取締役(取締役)
複合オブジェクトの構築を担当するための構成は、導体と抽象ビルダーの間の任意の関係が存在する工法ビルダー()メンバ構造とオブジェクトの組立方法は、複雑なオブジェクトの構築を完了するために、コールを構築することができます。クライアントは、クライアントにビルダーの種類を決定するために、導電体と相互作用する必要があり、その後、コマンダまたはクラスのコンストラクタメソッドによって設定されたビルダオブジェクト(コンフィギュレーションファイルと反射による)の具体例としては、入ってくる指揮官クラスオブジェクト。
パッケージのKFCビルダーモードの例
例ショー
パッケージは、一般に、複雑なオブジェクトである(例えば、ハンバーガーなど、ニワトリロール)、ステープルおよび飲料(ジュース、コーラ)、および他の成分を含みます。異なるパッケージが異なるコンポーネントを持って、KFCのスタッフは、顧客のニーズ、ステップバイステップで、これらのコンポーネントのロードに応じて、完全なパッケージを構築して、顧客に返却します。
コード例と説明
商品カテゴリ食事
食事パッケージは、主食を表す属性食品及び飲料、の2つのメンバーを含む複雑なオブジェクトの生成物である、ドリンク飲料表し、食事はまた、メンバープロパティの方法getterおよびsetterメソッドを含みます。
public class Meal { //部件 private String food; private String drink; public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } public String getFood() { return food; } public void setFood(String food) { this.food = food; } }
抽象ビルダークラスMealBuilder(パッケージビルダカテゴリ)
MealBuilderパッケージビルダーは、組立の抽象メソッドはbuildFood部材()と、MealBuilderの食事で食事を定義されたオブジェクトの種類は、方法工場getMeal()は食事オブジェクトを返しが設けられbuildDrink()を宣言し、それは抽象クラスです。
public abstract class MealBuilder { protected Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); public Meal getMeal() { return meal; } }
SubMealBuilderAビルダー詳細なクラス(パッケージビルダクラス)
パッケージ抽象クラスビルダーのサブクラスであるA、コンポーネント組み立て方法が実装抽象ビルダークラス宣言を作成するためのクラスビルダSubMealBuilderA固有。
public class SubMealBuilderA extends MealBuilder { @Override public void buildFood() { meal.setFood("一个鸡腿堡"); } @Override public void buildDrink() { meal.setDrink("一杯可乐"); } }
詳細なクラスビルダSubMealBuilderB(Bパッケージビルダクラス)
public class SubMealBuilderB extends MealBuilder { @Override public void buildFood() { meal.setFood("一个鸡肉卷"); } @Override public void buildDrink() { meal.setDrink("一杯果汁"); } }
司令官クラスKFCWaiter(ウェイターカテゴリ)
KFCWaiterクラスは、クライアントは、ビルダーの特定のタイプ、発呼部材とのオブジェクトビルダコンストラクト()メソッドファクトリメソッドを組み立てる方法を指定し、ウェイターKFC KFCパッケージ製造プロセスに対応する、クラス導体です。
public class KFCWaiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mealBuilder) { this.mealBuilder = mealBuilder; } public Meal construct() { mealBuilder.buildFood(); mealBuilder.buildDrink(); return mealBuilder.getMeal(); } }
XML操作ツール
public class XMLUtil { public static Object getBean() throws Exception { //创建解析器工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //创建解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //得到document Document document = builder.parse("config.xml"); //获取包含品牌名称的文本节点 NodeList brandNameList = document.getElementsByTagName("className"); Node classNode = brandNameList.item(0).getFirstChild(); String className = classNode.getNodeValue().trim(); Class c = Class.forName("com.builderPattern." + className); Object o = c.newInstance(); return o; } }
プロファイル
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <className>SubMealBuilderA</className> </configuration>
テストカテゴリ
public class Test { public static void main(String[] args) throws Exception { //动态确定套餐种类 MealBuilder mealBuilder = (MealBuilder) XMLUtil.getBean(); //服务员是指挥者 KFCWaiter waiter = new KFCWaiter(); //服务员准备套餐 waiter.setMealBuilder(mealBuilder); //客户获得套餐 Meal meal = waiter.construct(); System.out.println("套餐组成:"); System.out.println(meal.getDrink()); System.out.println(meal.getFood()); } }
分析の結果
プロファイルは、ノードSubMealBuilderAの内容に設定されている場合は次のように、出力結果は、次のとおり
プロファイルがノードSubMealBuilderBの内容に設定されている場合、出力結果は次の通りである:
ソースコードを変更せずに特定のビルダーの交換のみ設定ファイルを修正します。新しいコンクリートのビルダーを追加する必要がある場合は、単に新しいコンクリートのビルダークラスは抽象クラスビルダを継承追加し、状態の部品を組み立てるの抽象メソッドを実装して、特定の新しいビルダーの新しい設定を使用して、設定ファイルを変更しますパッケージタイプは、システムが開閉の原則の要件を満たすために、優れた柔軟性と拡張性を持っています。