今回は Builder パターン(一覧)。
Builder パターンの登場人物
- @Director → 型
- builderType : Class<?>
- @builderInstance → フィールド
- @Construct → メソッド
- @Builder → 型
- @BuildPart → メソッド
- @ConcreteBuilder → 具象クラス
- builderType : Class<?>
- @GetResult → メソッド
- resultType : Class<?>
- @Client → 型
- builderType : Class<?>
アノテーション定義
上記の定義の具体的な Java コード。
package org.waman.tools.design.gof.creational; import java.lang.annotation.*; import org.waman.tools.design.gof.structural.AdapterPattern; public final class BuilderPattern { private BuilderPattern(){} @Target(ElementType.TYPE) public static @interface Director{ Class<?> builderType() default Void.class; @Inherited @Target(ElementType.FIELD) public static @interface BuilderInstance{} @Inherited @Target(ElementType.METHOD) public static @interface Construct{} } @Target(ElementType.TYPE) public static @interface Builder{ @Inherited @Target(ElementType.METHOD) public static @interface BuildPart{} } @Target(ElementType.TYPE) public static @interface ConcreteBuilder{ Class<?> builderType() default Void.class; @Inherited @Target(ElementType.METHOD) public static @interface GetResult{ Class<?> resultType() default Void.class; } } /** GoF 本には定義されていません。 */ @Target(ElementType.TYPE) public static @interface Client{ Class<?> builderType() default Void.class; } }
サンプルコード in 『Java 言語で学ぶデザインパターン入門』
Director.java
@Director 役のクラス。
import org.waman.tools.design.gof.creational.BuilderPattern; import org.waman.tools.design.gof.creational.BuilderPattern.Director.BuilderInstance; import org.waman.tools.design.gof.creational.BuilderPattern.Director.Construct; @BuilderPattern.Director(builderType = Builder.class) public class Director { @BuilderInstance private Builder builder; ... @Construct public void construct() {...} }
Builder.java
@Builder 役のクラス。
import org.waman.tools.design.gof.creational.BuilderPattern; import org.waman.tools.design.gof.creational.BuilderPattern.Builder.BuildPart; @BuilderPattern.Builder public abstract class Builder { @BuildPart public abstract void makeTitle(String title); @BuildPart public abstract void makeString(String str); @BuildPart public abstract void makeItems(String... items); @BuildPart public abstract void close(); }
HTMLBuilder.java
@ConcreteBuilder 役のクラス。
import org.waman.tools.design.gof.creational.BuilderPattern; import org.waman.tools.design.gof.creational.BuilderPattern.ConcreteBuilder.GetResult; @BuilderPattern.ConcreteBuilder(builderType = Builder.class) public class HTMLBuilder extends Builder { ... @Override public void makeTitle(String title) {...} @Override public void makeString(String str) {...} @Override public void makeItems(String... items) {...} @Override public void close() {...} @GetResult(resultType = String.class) public String getResult() {...} }
Main.java
@Client 役のクラス。
import org.waman.tools.design.gof.creational.BuilderPattern; @BuilderPattern.Client(builderType = Builder.class) public class Main { ... public static void main(String[] args) {...} }