抽象工厂模式是在原有的工厂模式中加入产品族的概念。要研究什么是抽象工厂模式就要首先了解什么是产品族。所谓产品族就是是指位于不同产品等级结构中,功能相关联的产品组成的家族。(摘抄自:百度百科)下面我用代码来解释一下什么是产品族。
首先定义两个产品的接口:
public interface Cpu { public void run(); } public interface Keyboard { public void input(); }
然后我们在定义四个具体的产品类,分别是ChineseCpu和AmericanCpu,ChineseKeyboard和AmericanKeyboard:
public class ChineseCpu implements Cpu{ @Override public void run() { System.out.println("中国的cpu在运行"); } } public class AmericanCpu implements Cpu{ @Override public void run() { System.out.println("美国的cpu在运行"); } } public class ChineseKeyboard implements Keyboard{ @Override public void input() { System.out.println("中国的键盘在输入。。。"); } } public class AmericanKeyboard implements Keyboard{ @Override public void input() { System.out.println("美国的键盘在输入。。。"); } }
其中中国的cup和中国的键盘就可以看成一个产品族,美国的cpu和美国的键盘可以看成另一个产品族。
知道了什么是产品族,接下来就要引入我们今天讨论的主题什么是抽象工厂模式。大家还记的工厂模式吗?我们为每一个产品创建了一个属于他们的工厂,那个抽象工厂我们就可以认为是为每一个产品族创建一个工厂。我们就以上面来举例,现在我们已经有了中国cpu,美国cpu,中国键盘和美国键盘。那个我们现在就需要一个工厂来生产这些产品,如果是工厂模式,那么我们至少还需要4个具体的工厂类来生产这些产品,所以这个时候我们可以使用抽象工厂模式来做。代码如下:1.首先我们需要创建一个工厂接口。
public interface Factory { public Cpu makeCpu(); public Keyboard makeKeyboard(); }
2.定义两个实现工厂接口的实现类
public class ChineseFactory implements Factory{ @Override public Cpu makeCpu() { return new ChineseCpu(); } @Override public Keyboard makeKeyboard() { return new ChineseKeyboard(); } } public class AmericanFactory implements Factory{ @Override public Cpu makeCpu() { return new AmericanCpu(); } @Override public Keyboard makeKeyboard() { return new AmericanKeyboard(); } }
3.当用户使用时
public static void main(String[] args) { Factory AmericanFactory = new AmericanFactory(); Cpu aCpu = AmericanFactory.makeCpu(); aCpu.run(); Keyboard aKeyboard = AmericanFactory.makeKeyboard(); aKeyboard.input(); }
我们可以看到每个工厂创建了一个产品族。通过使用抽象工厂模式可以解决具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题,使代码更加的简洁。