倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「GoF デザインパターン」アノテーション (2) : Builder パターン

今回は 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) {...}
}

増補改訂版Java言語で学ぶデザインパターン入門 オブジェクト指向における再利用のためのデザインパターン