Factory Methodパターン
型引数と、リストを返すメソッドをスーパクラスに追加してみました。使いこなしていきたいFactory
% find . -name "*.java" -print0 |xargs -0 cat [] package framework; import java.util.ArrayList; import java.util.List; public abstract class Factory<T> { protected List<T> list = new ArrayList<T>(); public final Product create(String str) { Product p = createProduct(str); registerProduct(p); return p; } protected abstract Product createProduct(String str); protected abstract void registerProduct(Product p); public final List<T> getProductsList() { return list; } } package framework; public abstract class Product { public abstract void use(); } package idcard; import framework.Product; public class IDCard extends Product { private String owner; public IDCard(String str) { System.out.println(str + "のカードを作ります。"); this.owner = str; } @Override public void use() { System.out.println(owner + "のカードを使います。"); } public String getOwner() { return this.owner; } } package idcard; import framework.Factory; import framework.Product; public class IDCardFactory extends Factory<Product> { @Override protected Product createProduct(String str) { return new IDCard(str); } @Override protected void registerProduct(Product p) { list.add(p); } } package main; import idcard.IDCardFactory; import framework.Factory; import framework.Product; public class Main { public static void main(String[] args) { Factory<Product> factory = new IDCardFactory(); factory.create("山田太郎"); factory.create("山田花子"); factory.create("桃太郎"); for (Product p : factory.getProductsList()) { p.use(); } } }
山田太郎のカードを作ります。 山田花子のカードを作ります。 桃太郎のカードを作ります。 山田太郎のカードを使います。 山田花子のカードを使います。 桃太郎のカードを使います。