抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。举个简单的例子,比如用"勺子"喝"牛奶",用"筷子"吃"饭"……
package com.taobao.design; /** * 抽象工厂模式:创建型 */ public class AbstractFactory { public static void main(String[] args) { AbstractFactory client= new AbstractFactory(); KetchenFactory kf = new AKetchen(); client.eat(kf); } public void eat(KetchenFactory k){ System.out.println("A person eat "+k.getFood().getEatable()+" with "+k.getTableWare().getTool()+"!"); } } /** * 抽象工厂的接口 */ interface KetchenFactory{ public Food getFood(); public TableWare getTableWare(); } /** * 抽象餐具的接口 */ interface TableWare{ public String getTool(); } /** * 抽象食物的接口 */ interface Food{ public String getEatable(); } /** * 具体工厂AKetchen */ class AKetchen implements KetchenFactory{ public Food getFood(){ return new Milk(); } public TableWare getTableWare(){ return new Spoon(); } } /** * 具体餐具(spoon) */ class Spoon implements TableWare{ public String getTool() { return "spoon"; } } /** * 具体食物(milk) */ class Milk implements Food{ public String getEatable(){ return "milk"; } }
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式,什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是Lnix下的文本编辑器和WINDOWS下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。即有一系列产品,可以有多种实现的方案时,可以使用抽象工厂模式。