在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式(不如上例减去耳机这种产品,就回到工厂方法模式了)。
这样举例子其实很空洞,这里只是为了比较三种模式,给出抽象的例子才更容易看出区别。
那么上例中实际应用就是生产迭代器的例子,这里也对齐扩展来介绍抽象工厂模式。Iterator迭代器是Collection专属的,但是现在我们希望能生产Map的迭代器,我们都知道,Map不是继承自Collection的,遍历的方式是不一样的,这就相当于2个产品族,接下来我们就要来实现它。
为了演示我们如果实现这个同时能生产Map和Collection的迭代器,我会将例子一步步贴出来:
首先是抽象产品,用来描述迭代器的公共接口:
//抽象产品public intece IIterator<T> { boolean hasNext(); Object next();}
然后是抽象工厂,用来返回不同迭代器:
//抽象工厂public intece IIteratorFactory<T> { IIterator<T> iteratorMap(Map<T,Object> m); IIterator<T> iteratorCollection(Collection<T> c);}
接下来是具体产品。
Collection的迭代器(具体产品):
//具体产品,Collection迭代器(用到了代理模式)public class IteratorCollection<T> implements IIterator<T>{ Iterator<T> iterator; public IteratorCollection(Collection<T> c){ iterator = c.iterator(); } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public T next() { return iterator.next(); }}
Map的迭代器(具体产品):
//具体产品,Map迭代器(用到了代理模式)public class IteratorMap<T> implements IIterator<T>{ Iterator<Map.Entry<T, Object>> iterator; public IteratorMap(Map<T,Object> m){ iterator = m.entrySet().iterator(); } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public Object next() { return iterator.next().getValue(); }}
完成具体产品设计后,我们就要实现具体的工厂了:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-7.html
500颗原齐射
百万雄师过大海
谁也不傻