抽象工厂
-
简单介绍
抽象工厂模式属于创建型设计模式,是工厂模式的一种实现。工厂方法是按产品级维度对工厂进行抽象,而抽象工厂是按产品族维度对工厂进行抽象。产品级可以简单的理解为具体的单个产品,产品族则是有多个产品构成。如苹果公司生产的手机、手表等单个产品可以简单理解为产品级,这些苹果公司生产的这一系列产品(手机、手表)放在一起则可以简单理解为一个产品族。
-
使用场景
业务中需要针对产品族维度的扩展,且不需要针对产品级维度的扩展。抽象工厂对产品族维度的扩展时能很好的满足OCP原则,但是针对产品级维度的扩展时,则不能满足OCP原则。
-
场景举例
JDK中的List接口定义了多个抽象方法(size()、get(int index)、Object[] toArray()),可以将单个方法理解成一个产品级,List中的所有方法构成一个产品族。具体的实现工厂是ArrayList,LinkedList。
-
UML类图
-
具体实现
-
故事背景
樱桃公司(CherryCompany)是一家连锁水果公司,对外售卖的水果品种高达数十种(产品级),而这数十种水果有分为进口水果和国产水果(产品族)。樱桃公司只在一家名为ImportFruitFactory的公司采购进口水果。在一家名为公司DomesticFruitFactory采购国产水果,现在樱桃公司决定分别采购国内外的苹果和香蕉:
public interface Apple { }
public interface Banana { }
/** * 国产苹果 */ public class DomesticApple implements Apple { }
/** * 国产香蕉 */ public class DomesticBanana implements Banana { }
/** * 进口苹果 */ public class ImportApple implements Apple { }
/** * 进口香蕉 */ public class ImportBanana implements Banana { }
public interface Factory { Banana getBanana(); Apple getApple(); }
/** * 负责生产国产水果产品族的香蕉和苹果 */ public class DomesticFruitFactory implements { Apple getApple(){ return new DomesticApple(); } Banana getBanana() { return new DomesticBanana(); } }
/** * 负责生产进口水果产品族的香蕉和苹果 */ public class ImportFruitFactory implements { Apple getApple(){ return new ImportApple(); } Banana getBanana() { return new ImportBanana(); } }
-
-
源码展示
-
JDK中容器的List机器子类的实现伪代码
public interface List<E> extends Collection<E> { // 将这些方法组合,理解成一个产品族 int size(); Iterator<E> iterator(); Object[] toArray(); }
public class ArrayList<E> implements Iterable<E> { public int size() { return size; } public Iterator<E> iterator() { return new Itr(); } public Object[] toArray() { return Arrays.copyOf(elementData, size); } }
public class LinkedList<E> implements Iterable<E> { public int size() { return size; } public Iterator<E> iterator() { return new Itr(); } public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Node<E> x = first; x != null; x = x.next) result[i++] = x.item; return result; } public Iterator<E> iterator() { return listIterator(); } }
-