Java:デザインモードのBuilder

4216 ワード

パターン名
ビルダーモード/ビルダーモードBuilder
定義#テイギ#
オブジェクト構築モードです.複雑なオブジェクトの構築プロセスを抽象化(抽象カテゴリ)することができ、この抽象プロセスの異なる実装方法が異なる表現(属性)のオブジェクトを構築することができる.
≪インスタンス|Instance|emdw≫
1台のCarを組み立てる動作はいくつかのステップに分離できます
参加者
Builder(抽象Builder)は、Productオブジェクトを作成する各コンポーネントに抽象インタフェースを指定します.ConcreteBuilder(特定のBuilder)は、製品の各部品を構築および組み立てるためにBuilderのインタフェースを実現する.作成した表示を定義し、明確にします.製品を検索するインタフェースDirector(アセンブリ)を提供し、Builderインタフェースを使用するオブジェクトを構築します.Product(組み立てられた製品)は、構築された複雑なオブジェクトを表す.ConcreateBuilderは、製品の内部表示を作成し、そのアセンブリプロセスを定義します.コンポーネントを定義するクラスを含み、これらのコンポーネントを最終製品にアセンブリするインタフェースを含む.
コラボレーション
お客様はDirectorオブジェクトを作成し、その目的のBuilderオブジェクトで構成します.・         製品部品が生成されると、Directorガイドがジェネレータに通知します.・         ジェネレータは、ガイドの要求を処理し、その製品に部品を追加します.・         お客様は、ジェネレータから製品を取得します.
適用シーン
·         複雑なオブジェクトを作成するアルゴリズムが、そのオブジェクトの構成部分とそれらの組み立て方法とは独立しなければならない場合.         構築プロセスが構築されたオブジェクトに異なる表現を許可しなければならない場合.
構造階層
 
メリット
·         製品の内部表示を変えることができます         構築コードと表示コードを分離します.         構造プロセスをより細かく制御できます
制限
·         インタフェースジェネレータを組み立て、構築します.したがって、ジェネレータインタフェースは、様々なタイプの特定のジェネレータのために製品を構築するために十分に一般的でなければならない.・         抽象クラスがない場合、通常、特定のジェネレータによって生成される製品は、異なる製品に共通の親クラスを与えるほど表現の差が大きく、あまり意味がありません.・         ジェネレータのデフォルトのメソッドが空のメソッドとして定義されている場合、お客様は興味のある操作だけを再定義できます.
エンティティ製品クラス:
package com.freestudio.designpattern;

/**
 * Builder  :   
 * 
 * @author antony
 * 
 */
public class Car
{
	String mWheel;//   
	String mEngine;//    
	String mSteeringWheel;//    

	void setWheel(String wheel)
	{
		mWheel = wheel;
	}

	void setEngine(String engine)
	{
		mEngine = engine;
	}

	void setSteeringWheel(String steeringWheel)
	{
		mSteeringWheel = steeringWheel;
	}

	public void printCarInfo()
	{
		System.out.println("Car:wheel is " + mWheel + ",Engine is " + mEngine
				+ ",SteeringWheel is " + mSteeringWheel);
	}

}

抽象ビルダー
package com.freestudio.designpattern;

public abstract class CarBuilder
{
	protected Car mCar;//         

	public Car getCar()
	{
		return mCar;
	}

	public void createCar()
	{
		mCar = new Car();
	}

	//     
	public abstract void buildWheel();

	//      
	public abstract void buildEngine();

	//      
	public abstract void buildSteeringWheel();
}

詳細ビルダー
package com.freestudio.designpattern;

//     
public class FordCarBuilder extends CarBuilder
{

	@Override
	public void buildWheel()
	{
		// TODO Auto-generated method stub
		mCar.setWheel("ford wheel");
	}

	@Override
	public void buildEngine()
	{
		// TODO Auto-generated method stub
		mCar.setEngine("ford engine");
	}

	@Override
	public void buildSteeringWheel()
	{
		// TODO Auto-generated method stub
		mCar.setSteeringWheel("ford steeringWheel");
	}

}
package com.freestudio.designpattern;

//     
public class SkodaCarBuilder extends CarBuilder
{

	@Override
	public void buildWheel()
	{
		// TODO Auto-generated method stub
		mCar.setWheel("skoda wheel");
	}

	@Override
	public void buildEngine()
	{
		// TODO Auto-generated method stub
		mCar.setEngine("skoda engine");
	}

	@Override
	public void buildSteeringWheel()
	{
		// TODO Auto-generated method stub
		mCar.setSteeringWheel("skoda steeringWheel");
	}

}

テストコード:
package com.freestudio.designpattern;

public class Main
{
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		TestBuilder();
		// TestPrototype();
		// TestFactory();
		// TestSingleTon();
	}

	
	static void TestBuilder()
	{
		SkodaCarBuilder skoda = new SkodaCarBuilder();
		FordCarBuilder ford = new FordCarBuilder();
		Operator op = new Operator();
		//      car
		op.setCarBuilder(skoda);
		op.constructCar();
		Car car = op.getCar();
		car.printCarInfo();
		//      car
		op.setCarBuilder(ford);
		op.constructCar();
		car = op.getCar();
		car.printCarInfo();
	}
}

出力:
Car:wheel is skoda wheel,Engine is skoda engine,SteeringWheel is skoda steeringWheel Car:wheel is ford wheel,Engine is ford engine,SteeringWheel is ford steeringWheel
参照先:
ジェネレータモード