简单_工厂方法(Factory Method)模式


方法工厂模式属于创建型模式,很简单很实用,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;
		}
	}
}

猜你喜欢

转载自jqsl2012.iteye.com/blog/1377770