Java设计模式:Abstract Factory(抽象工厂)模式

概念定义

抽象工厂(Abstract Factory)模式提供一个建立一系列相关或相互依赖对象的接口,而无需指定它们具体的类。java

抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品。换句话说,抽象工厂建立一整套具备相互依赖或做用关系的产品(至少两个产品),而工厂方法中的工厂只能建立单一系列的产品。ide

应用场景

  • 客户端不须要知道它所建立的对象的类。
  • 须要一组对象共同完成某种功能时,而且可能存在多组对象完成不一样功能的状况。
  • 系统结构稳定,不会频繁地增长对象。

示例代码

抽象工厂模式由工厂接口(或抽象类)、一组实现工厂接口工厂类、一个产品接口(或抽象类)和一组实现产品接口的具体产品组成。设计

本节经过一个"喜闻乐见"的豪车系列,展现抽象工厂模式的实现。示例代码以下(注意豪车有两个产品 -- 引擎和娱乐系统):code

// 产品接口 - 引擎 //
public interface IEngine {
    void show();
}
// 若干具体的产品 - 宝马与奔驰的引擎 //
public class BmwEngine implements IEngine {
    @Override
    public void show() { System.out.println("Bmw's engine"); }
}
public class BenzEngine implements IEngine {
    @Override
    public void show() { System.out.println("Benz's engine"); }
}

// 产品接口 - 娱乐系统 //
public interface IEntertainment {
    void show();
}
// 若干具体的产品 - 宝马与奔驰的娱乐系统 //
public class BmwEntertainment implements IEntertainment {
    @Override
    public void show() { System.out.println("Bmw's entertainment"); }
}
public class BenzEntertainment implements IEntertainment {
    @Override
    public void show() { System.out.println("Benz's entertainment"); }
}

// 抽象工厂接口 //
public interface IFactory {
    public IEngine createEngine(); // 没必要为引擎和娱乐系统分别增长两个工厂接口!
    public IEntertainment createEntertainment();
}
// 若干具体的工厂 - 为车建立引擎和娱乐系统 //
public class BmwFactory implements IFactory { // 结合了工厂方法模式
    @Override
    public IEngine createEngine() { return new BmwEngine(); }
    @Override
    public IEntertainment createEntertainment() { return new BmwEntertainment(); }
}
public class BenzFactory implements IFactory {
    @Override
    public IEngine createEngine() { return new BenzEngine(); }
    @Override
    public IEntertainment createEntertainment() { return new BenzEntertainment(); }
}

客户端经过以下方式调用:对象

IFactory bmwFactory = new BmwFactory();
bmwFactory.createEngine().show();
bmwFactory.createEntertainment().show();
IFactory benzFactory = new BenzFactory();
benzFactory.createEngine().show();
benzFactory.createEntertainment().show();

模式优缺点

抽象工厂模式的优势以下:接口

  • 当一个产品族中的多个对象被设计成一块儿工做时,它能保证客户端始终只使用同一个产品族中的对象。

缺点以下:产品

  • 产品族扩展很是困难。增长一个系列的某一产品时,须要同时修改抽象工厂和具体工厂。

业界实践

class

相关文章
相关标签/搜索