倭マン's BLOG

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

「GoF デザインパターン」アノテーション (3) : Factory Method パターン

今回は Factory Method パターン一覧)。

Factory Method パターンの登場人物

  • @Framework → パッケージ
  • @Creator → 型
    • productType : Class<?>
    • @FactoryMethod → メソッド
    • @PrimitiveMethod → メソッド
  • @Product → 型
    • factoryType : Class<?>
  • @ConcreteCreator → 具象クラス
    • creatorType : Class<?>
  • @ConcreteProduct → 具象クラス
    • productType : Class<?>

アノテーション定義


上記の定義の具体的な Java コード。

package org.waman.tools.design.gof.creational;

import java.lang.annotation.*;
import org.waman.tools.design.gof.structural.AdapterPattern;

public final class FactoryMethodPattern {
    
    private FactoryMethodPattern(){}

    @Target(ElementType.PACKAGE)
    public static @interface Framework{}

    @Target(ElementType.TYPE)
    public static @interface Creator{

        Class<?> productType() default Void.class;

        @Inherited @Target(ElementType.METHOD)
        public static @interface FactoryMethod{}

        @Inherited @Target(ElementType.METHOD)
        public static @interface PrimitiveMethod{}
    }

    @Target(ElementType.TYPE)
    public static @interface Product{
        Class<?> factoryType() default Void.class;
    }

    @Target(ElementType.TYPE)
    public static @interface ConcreteCreator{
        Class<?> creatorType() default Void.class;
    }

    @Target(ElementType.TYPE)
    public static @interface ConcreteProduct{
        Class<?> productType() default Void.class;
    }
}

サンプルコード in 『Java 言語で学ぶデザインパターン入門』


Factory.java

@Creator 役のクラス。

package sample.gof.creational.factory_method.framework;

import org.waman.tools.design.gof.creational.FactoryMethodPattern;
import org.waman.tools.design.gof.creational.FactoryMethodPattern.Creator.FactoryMethod;
import org.waman.tools.design.gof.creational.FactoryMethodPattern.Creator.PrimitiveMethod;

@FactoryMethodPattern.Creator(productType = Product.class)
public abstract class Factory {
    
    @FactoryMethod public final Product create(String owner) {...}
    
    @PrimitiveMethod protected abstract Product createProduct(String owner);
    @PrimitiveMethod protected abstract void registerProduct(Product product);
}

Product.java

@Product 役のクラス。

package sample.gof.creational.factory_method.framework;

import org.waman.tools.design.gof.creational.FactoryMethodPattern;

@FactoryMethodPattern.Product(factoryType = Factory.class)
public abstract class Product {
    public abstract void use();
}

IDCardFactory.java

@ConcreteCreator 役のクラス。

import org.waman.tools.design.gof.creational.FactoryMethodPattern;
import sample.gof.creational.factory_method.framework.*;

@FactoryMethodPattern.ConcreteCreator(creatorType = Factory.class)
public class IDCardFactory extends Factory {
    @Override protected Product createProduct(String owner) {...}
    @Override protected void registerProduct(Product product) {...}
    ...
}

IDCard.java

@ConcreteProduct 役のクラス。

import org.waman.tools.design.gof.creational.FactoryMethodPattern;
import sample.gof.creational.factory_method.framework.Product;

@FactoryMethodPattern.ConcreteProduct(productType = Product.class)
public class IDCard extends Product {
    ...
    @Override public void use() {...}
    ...
}

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