定义

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

角色结构

  • AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如上述类图中的
  • AbstractFactory就定义了两个方法,分别创建产品A和产品B
  • ConcreteFactory:具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生产一组具体产品,这饿产品构件成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的ConcreteFactoryA和ConcreteFactoryB
  • AbstractProduct:抽象产品角色,为每种产品声明接口,如图中AbstractProductA、AbstractProductB
  • ConcreteProduct:具体产品角色,定义了工厂生产的具体产品对象,实现抽象产品接口声明的业务方法,如图中
  • ConcreteProductA1、ConcreteProductA2、ConcreteProductB1、ConcreteProductB2

    优点

    1、具体产品在应用层代码隔离,无须关系创建细节
    2、将一个系列的产品统一到一起创建

    缺点

    1、规定了所有可能被创建的产品集合,产品族扩展新的产品困难,需要修改抽象工厂的接口
    2、增加了系统的抽象性和理解难度

    适用环境

    1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节<br /> 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品<br /> 同属于同一个产品族的产品是一起使用的,这一约束必须在系统的设计中体现出来<br /> 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现

    示例

    键盘接口

    1. public interface Keybo {
    2. void sayHi();
    3. }

    鼠标对象

    1. public interface Mouse {
    2. void sayHi();
    3. }

    戴尔工厂

    1. public class DellFactory implements PCFactory {
    2. @Override
    3. public Mouse createMouse() {
    4. return new DellMouse();
    5. }
    6. @Override
    7. public Keybo createKeybo() {
    8. return new DellKeybo();
    9. }
    10. }

    惠普工厂

    ```java public class HpFactory implements PCFactory {

    @Override public Mouse createMouse() {

    1. return new HpMouse();

    }

    @Override public Keybo createKeybo() {

    1. return new HpKeybo();

    } }

  1. <a name="qQFVi"></a>
  2. #### 戴尔键盘实现
  3. ```java
  4. public class DellKeybo implements Keybo {
  5. @Override
  6. public void sayHi() {
  7. System.out.println("DellKeybo.sayHi");
  8. }
  9. }

戴尔鼠标实现

  1. public class DellMouse implements Mouse {
  2. @Override
  3. public void sayHi() {
  4. System.out.println("DellMouse.sayHi");
  5. }
  6. }

惠普键盘实现

  1. public class HpKeybo implements Keybo {
  2. @Override
  3. public void sayHi() {
  4. System.out.println("HpKeybo.sayHi");
  5. }
  6. }

惠普鼠标实现

  1. public class HpMouse implements Mouse {
  2. @Override
  3. public void sayHi() {
  4. System.out.println("HpMouse.sayHi");
  5. }
  6. }

电脑工厂

  1. public interface PCFactory {
  2. Mouse createMouse();
  3. Keybo createKeybo();
  4. }

测试类

  1. public class Test {
  2. public static void main(String[] args) {
  3. PCFactory dellFactory = new DellFactory();
  4. dellFactory.createKeybo().sayHi();
  5. dellFactory.createMouse().sayHi();
  6. PCFactory hpFactory = new HpFactory();
  7. hpFactory.createMouse().sayHi();
  8. hpFactory.createKeybo().sayHi();
  9. }
  10. }