设计模式示例-工厂方法模式
来源:互联网 发布:java动态代理详解 编辑:程序博客网 时间:2024/04/29 06:43
工厂方法模式中,使用到了模板方法模式以及迭代器模式,因为工厂中生产出的产品需要保存起来并且提供对外遍历的接口。
package factorymethod.framework;import iterator.Aggregate;/** * * 抽象工厂类,同时实现了Aggregate聚合接口返回迭代器,具体迭代器由子类去实现 * * @author Administrator * @version [版本号, 2012-10-17] * @see [相关类/方法] * @since [产品/模块版本] */public abstract class AbstractFactory implements Aggregate{ /** * 创建产品的抽象方法,具体实现在子类中进行 * @param owner * @return * @see [类、类#方法、类#成员] */ protected abstract Product createProduct(String owner); /** * 注册产品的抽象方法,具体实现在子类中进行 * @param p * @see [类、类#方法、类#成员] */ protected abstract void registerProduct(Product p); /** * 模板方法 * @param owner * @return * @see [类、类#方法、类#成员] */ public final Product create(String owner) { Product p = createProduct(owner); registerProduct(p); return p; }}
package factorymethod.framework;/** * * 抽象产品类 * * @author Administrator * @version [版本号, 2012-10-17] * @see [相关类/方法] * @since [产品/模块版本] */public abstract class Product{ /** * 每个产品都必须实现该方法 * @see [类、类#方法、类#成员] */ abstract public void use();}
package factorymethod.idcard;import factorymethod.framework.Product;/** * * IDCard具体产品实现类,继承抽象产品 * * @author Administrator * @version [版本号, 2012-10-17] * @see [相关类/方法] * @since [产品/模块版本] */public class IDCard extends Product{ private String owner; IDCard(String owner) { System.out.println("建立" + owner + "的IDCard"); this.owner = owner; } @Override public void use() { System.out.println("使用" + owner + "的IDCard"); } }
package factorymethod.idcard;import iterator.Aggregate;import iterator.Iterator;import java.util.Vector;import factorymethod.framework.AbstractFactory;import factorymethod.framework.Product;/** * * IDCardProduct生产工厂类,继承抽象工厂,可以使用迭代器模式去迭代工厂中的所有产品 * * @author Administrator * @version [版本号, 2012-10-17] * @see [相关类/方法] * @since [产品/模块版本] */public class IDCardFactory extends AbstractFactory implements Aggregate{ private Vector<IDCard> idCards = new Vector<IDCard>(); private int last = 0; @Override protected Product createProduct(String owner) { IDCard idCard = new IDCard(owner); return idCard; } @Override protected void registerProduct(Product p) { idCards.add((IDCard)p); last++; } @Override public Iterator iterator() { return new IDCardIterator(); } private class IDCardIterator implements Iterator { private int index = 0; @Override public boolean hasNext() { if (index < last) { return true; } return false; } @Override public Object next() { IDCard card = idCards.get(index); index++; return card; } } }
package factorymethod;import iterator.Iterator;import factorymethod.framework.AbstractFactory;import factorymethod.framework.Product;import factorymethod.idcard.IDCardFactory;public class TestFactorymethod{ /** 测试工厂方法和模板方法主函数 * @param args * @see [类、类#方法、类#成员] */ public static void main(String[] args) { /** * 使用的时候面向的是抽象工厂 */ AbstractFactory factory = new IDCardFactory(); factory.create("duchao"); factory.create("caorui"); factory.create("sunhang"); Iterator iterator = factory.iterator(); while (iterator.hasNext()) { Product p = (Product)iterator.next(); p.use(); } } }