AspectJ を使ったデザインパターンの改善と支援 >
Builder

asato <asato@ncfreak.com>

最終更新日 : 2002/9/26 (2002/9/26 より)

Builder

複合オブジェクトについて、その作成過程を表現形式に依存しないものにすることにより、同じ作成過程で異なる表現形式のオブジェクトを生成できるようにする。

考慮点

AspectJ を使った Builder に関するテクニックの種類

特化した作成過程

注: こんなシチュエーションが実践的にありうるかどうかは不明です。

サンプルコード:

package dp.builder;

public interface Builder {

	public void buildPartA();
	public void buildPartB();
}
package dp.builder;

public class ConcreteBuilderA  implements Builder {

	private String result = "";

	public void buildPartA() {
		this.result += "PartA ";
	}
	public void buildPartB() {
		this.result += "PartB ";
	}
	public String getResult() {
		return result;
	}
}
package dp.builder;

public class ConcreteBuilderB implements Builder {

	private String result = "";

	public void buildPartA() {
		this.result = "<PartA>" + result + "</PartA>";
	}
	public void buildPartB() {
		this.result = "<PartB>" + result + "</PartB>";
	}
	public String getResult() {
		return result;
	}
}
package dp.builder;

public class Director {

	private Builder builder;

	public Director(Builder builder) {
		this.builder = builder;
	}
	public void construct() {
		builder.buildPartA();
		builder.buildPartB();
	}
}
package dp;

import dp.builder.*;

public class Client {

	public static void main(String[] args) {
		ConcreteBuilderA builderA = new ConcreteBuilderA();
		ConcreteBuilderB builderB = new ConcreteBuilderB();

		new Director( builderA ).construct();
		new Director( builderB ).construct();

		System.out.println( builderA.getResult() );
		System.out.println( builderB.getResult() );
	}
}
package dp.builder;

privileged aspect BuilderAspect {

	pointcut construct() : withincode( void Director.construct() );

	pointcut buildPartB(ConcreteBuilderB builder) :
		target(builder) && call( void Builder.buildPartB() ) && construct();

	after(ConcreteBuilderB  builder) : buildPartB(builder) {
		builder.buildPartC();
	}

	private void ConcreteBuilderB.buildPartC() {
		this.result = "<PartC>" + result + "</PartC>";
	}
}
PartA PartB
<PartC><PartB><PartA></PartA></PartB></PartC>