方法工厂模式属于创建型模式,很简单很实用,java.util.Collection.#iterator即运用了此模式。以下的代码是本人初学设计模式的简单理解,参考于java.util.Collection.#iterator
package design.methodFactory2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-1-27 下午10:11:49 <br> * */ public class Test { public static void main(String[] args) { /* * 工厂方法(Factory Method)模式 * * Collection:定义一个接口,该接口负责创建指定的产品Iterator * Iterator:产品 * AbstractList/AbstractLinkedList:工厂接口的子类,紧紧负责创建自身需要的产品 * * 简单工厂模式譬如String.valueOf()等都是一个静态的方法负责创建各式各样的产品,方法中有各式各样的 * 逻辑判断,初看貌似简单工厂是一个万能工厂,其实它是违反了开-闭原则的(开-闭:对扩展开放,对修改关闭), * 如果以后需要添加新的产品那么就必须修改简单工厂的静态方法,如果产品的数量比较小那还不要紧,如果产品的 * 数量很多而且带有复杂的业务逻辑那就麻烦了,所以简单工厂只适用于创建产品数量很少的情况。 * * 工厂方法模式就完全符合开闭原则,新增加的产品无需修改原有的工厂。 * 工厂方法模式中的抽象工厂类只是一个契约,它定义了要生产的产品,所有的子级工厂类都必须实现该契约。 * java.util.Collection.#iterator即运用了方法工厂模式 */ Collection c1 = new AbstractList(); Iterator it = c1.iterator(); Collection c2 = new AbstractLinkedList(); it = c2.iterator(); } }
package design.methodFactory2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-1-27 下午10:12:27 <br> * */ public interface Collection { Iterator iterator(); }
package design.methodFactory2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-1-27 下午10:12:59 <br> * */ public interface Iterator { boolean hasNext(); Object next(); }
package design.methodFactory2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-1-27 下午10:15:11 <br> * */ public class AbstractList implements Collection { public Iterator iterator() { System.out.println("AbstractList"); return new Itr(); } private class Itr implements Iterator { public boolean hasNext() { return false; } public Object next() { // TODO Auto-generated method stub return null; } } }
package design.methodFactory2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-1-27 下午10:21:54 <br> * */ public class AbstractLinkedList implements Collection { public Iterator iterator() { System.out.println("AbstractLinkedList"); return new linkedlistItr(); } private class linkedlistItr implements Iterator { public boolean hasNext() { // TODO Auto-generated method stub return false; } public Object next() { // TODO Auto-generated method stub return null; } } }