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();
		}
	}

}
山田太郎のカードを作ります。
山田花子のカードを作ります。
桃太郎のカードを作ります。
山田太郎のカードを使います。
山田花子のカードを使います。
桃太郎のカードを使います。