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