一、定义与特点
为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
二、模式的结构与实现
1. 模式的结构
抽象工厂模式也就是不仅生产鼠标,同时生产键盘。
也就是PC厂商是个父类,有生产鼠标,生产键盘两个接口。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
创建工厂时,由戴尔工厂创建。
后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。
2. 模式的实现
(1) 抽象工厂
public abstract class PcFactory { public abstract Mouse createMouse(); public abstract Keybo createKeybo(); }
(2) 抽象产品
//鼠标 public abstract class Mouse { public abstract void sayHi(); } //键盘 public abstract class Keybo { public abstract void sayHi(); }
(3) 具体产品
//惠普鼠标 public class HpMouse extends Mouse{ @Override public void sayHi() { System.out.println("HpMouse"); } } //惠普键盘 public class HpKeybo extends Keybo{ @Override public void sayHi() { System.out.println("HpKeybo"); } }
//戴尔鼠标 public class DellMouse extends Mouse{ @Override public void sayHi() { System.out.println("DellMouse"); } } //戴尔键盘 public class DellKeybo extends Keybo{ @Override public void sayHi() { System.out.println("DellKeybo"); } }
(4) 具体工厂
//惠普工厂 public class HpFactory extends PcFactory{ @Override public Mouse createMouse() { return new HpMouse(); } @Override public Keybo createKeybo() { return new HpKeybo(); } }
//戴尔工厂 public class DellFactory extends PcFactory{ @Override public Mouse createMouse() { return new DellMouse(); } @Override public Keybo createKeybo() { return new DellKeybo(); } }
三、模式的优缺点
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。