概述
- 当系统准备为用户提供一些列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂方法模式来设计系统。
- 抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽放方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重新这些抽象方法为用户提供一系列相关的对象。
抽象工厂模式的结构
抽象工厂模式的结构中包括四种角色。
- 抽象产品(Product)
- 具体产品(ConcreteProduct)
- 抽象工厂(AbstractFactory)
- 具体工厂(ConcreteFactory)
抽象产品(Product)
- 一个抽象类或接口。
- 负责定义具体产品必须事先的方法。
具体产品(ConcreteProduct)
- 具体产品是一个类。
- 如果Product是一个抽象类,那么具体产品是Product的子类;
- 如果Product是一个接口,具体产品是实现Product接口的类。
抽象工厂(AbstractFactory)
- 一个接口或抽象类。
- 负责定义若干个抽象方法。
具体工厂(ConcreteFactory)
- 如果抽象工厂是抽象类,具体工厂是抽象工厂的子类;
- 如果抽象工厂是接口,具体工厂是实现抽象工厂的类。
- 具体工厂重写抽象工厂中的抽象方法,使该方法返回具体产品的实例。
抽象工厂模式的使用
- 应用程序在使用抽象工厂模式时,只和抽象产品、抽象工厂以及具体工厂打交道。
抽象工厂方法模式的优点
- 抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱藕。
- 使用抽象工厂模式可以方便的为用户配置一系列对象。用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混用不同系列中的对象。
- 在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。
适合使用抽象工厂模式的情景
- 系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类脱耦。
- 系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何关联的。
- 系统需要为用户提供一系列对象,但只需要用户知道这些对象又哪些方法可用,不需要用户知道这些对象的创建过程。