設計モード学習ノート——作成者モード


このモードも比較的に理解しにくくて、私は《モードの禅を設計します》の上で説明する例を見て、しかし見終わった後に1頭の霧の水、その上とても乱れて、依然として理解していないで、何度も見て、やはり理解していないで、そこで私はまた私の教科書をめくって、その上の例を見て、しかし結果は依然としてです.そこでネットで探して、たくさん探して、しかしすべてとても理想的ではありませんて、最后にカンフーは心を负わないで、ついに1つの私が理解することができることを探し当てて、その上私は比较的に合理的な創建者のモードの说明だと思って、ここで作者に感谢して、原文の住所:http://blog.csdn.net/lovelion/article/details/7426015
作成者モードの定義:
複雑なオブジェクトのコンストラクションをその表現から分離し、同じコンストラクションプロセスで異なる表現を作成できます.コンストラクタモードは、オブジェクト作成モードです.
なぜ作成者モデルがあるのでしょうか?
ソフトウェアシステムでは、通常、各部分のサブオブジェクトが一定のアルゴリズムで構成される「複雑なオブジェクト」の作成作業に直面することがある.需要の変化により,この複雑なオブジェクトの各部分はしばしば激しい変化に直面するが,それらを組み合わせたアルゴリズムは相対的に安定である.種の変化にどのように対応しますか?「複雑なオブジェクトの各部分」の変化を分離する「パッケージングメカニズム」をどのように提供し、システム内の「安定構築アルゴリズム」を必要に応じて変化させないようにしますか?そこで作成者モデルが誕生しました
共通クラス図は次のとおりです.
複雑な対象はどこに表れているのか.すなわち、1つの複雑なオブジェクトには多くのメンバー変数があり、各メンバー変数は、この製品を構成する一部を表し、異なる複雑なオブジェクトに対してもメンバー変数の変化が大きいため、この部分の変化したメンバー変数を抽出し、Builderクラスに渡して制御し、Builderクラスは実際に複雑なオブジェクトを生成するクラスである.ここでは各部分の実装と組み立てを行う.Directorクラスには主に2つの役割があります.一方、顧客と作成プロセスを分離します.一方、あるbuildPartX()メソッドが呼び出されるかどうか、および複数のbuildPartX()メソッドが呼び出される前後順など、製品の作成プロセスを制御します.指揮者は抽象的な建造者に対してプログラミングし、クライアントは具体的な建造者のタイプを知るだけで、指揮者クラスを通じて建造者の関連方法を呼び出し、完全な製品オブジェクトを返すことができる.
ソースコードは次のとおりです.
public class Product {
	
	private String partA;
	private String partB;
	private String partC;
	
	public String getPartA() {
		return partA;
	}
	public void setPartA(String partA) {
		this.partA = partA;
	}
	public String getPartB() {
		return partB;
	}
	public void setPartB(String partB) {
		this.partB = partB;
	}
	public String getPartC() {
		return partC;
	}
	public void setPartC(String partC) {
		this.partC = partC;
	}
	
	public void show(){
		System.out.println(this.partA);
		System.out.println(this.partB);
		System.out.println(this.partC);
	}
}
public abstract class Builder {
	protected Product product=new Product();
	
	public abstract void bulidPartA();
	public abstract void bulidPartB();
	public abstract void bulidPartC();
	
	public Product getResult(){
		return this.product;
	}
}
public class ConcreteBuilder1 extends Builder {

	@Override
	public void bulidPartA() {
		super.product.setPartA("PartA is built by builder1");
	}

	@Override
	public void bulidPartB() {
		super.product.setPartB("PartB is built by builder1");
	}

	@Override
	public void bulidPartC() {
		super.product.setPartC("PartC is built by builder1");
	}

}
public class ConcreteBuilder2 extends Builder {

	@Override
	public void bulidPartA() {
		super.product.setPartA("PartA is built by builder2");
	}

	@Override
	public void bulidPartB() {
		super.product.setPartB("PartB is built by builder2");
	}

	@Override
	public void bulidPartC() {
		super.product.setPartC("PartC is built by builder2");
	}

}
public class Director {
	private Builder builder;
	
	public Director(Builder builder){
		this.builder=builder;
	}
	
	public void setBuilder(Builder builder){
		this.builder=builder;
	}
	
	public Product construct(){
		
		this.builder.bulidPartA();
		this.builder.bulidPartB();
		this.builder.bulidPartC();
		
		return this.builder.getResult();
	}
}
public class Client {
	public static void main(String[] args) {
		Builder builder1=new ConcreteBuilder1();
		
		Director director=new Director(builder1);
		
		Product product1=director.construct();
		
		product1.show();
		
		Builder builder2=new ConcreteBuilder2();
		
		director.setBuilder(builder2);
		
		Product product2=director.construct();
		
		product2.show();
	}
}

建設者モデルは抽象工場モデルと少し似ているが、建設者モデルは完全な複雑な製品を返し、抽象工場モデルは一連の関連製品を返す.抽象ファクトリ・モードでは、クライアントは特定のファクトリを選択して必要なオブジェクトを生成し、ビルダー・モードでは、クライアントは特定のビルダー・タイプを指定してDirectorを指導します.
クラスはどのようにオブジェクトを生成し、複雑なオブジェクトを一歩一歩構築し、結果を返します.抽象的な工場モデルを自動車部品生産工場と見なし、異なるタイプの自動車部品を生成すると、建設者モデルは自動車組立工場であり、部品を組み立てることで完全な自動車に戻る.