设计模式示例-工厂方法模式

来源:互联网 发布: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();        }    }    }





原创粉丝点击