1.1概述
提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类。这就是抽象工厂模式的定义。
设计某些系统时可能需要为用户提供一系列相关的对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否则用户不仅要清楚地知道使用哪些类来创建这些对象,而且还必须要清楚对象之间是如何关联的,使得用户的代码和这些类形成紧耦合、缺乏弹性、不利于维护。
例如,军队要为士兵(用户)提供机关枪、手枪以及相应的子弹,但军队系统不希望由士兵提供来生产机关枪、手枪以及子弹,而是由相应的工厂专门负责配套生产,即有一个专门负责生产机关枪、手枪、子弹的工厂。具体关系如下图一所示:
图一:兵工厂与枪械、子弹关系示意图(PS:仅仅作为示意图,不要纠结哟)
当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂方法模式来设计系统。抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
1.2模式的结构
抽象工厂模式的结构中包括四种角色:
(1)抽象产品(Product):一个抽象类或接口,负责定义具体产品必须实现的方法;
(2)具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品就是实现Product的子类;如果Product是一个接口,那么具体产品就是实现Product接口的类;
(3)抽象工厂(AbstractFactory):一个接口或抽象类,负责定义若干个抽象方法;
(4)具体工厂(ConcreteFactory):如果抽象工厂是抽象类,具体工厂就是抽象工厂的子类;如果抽象工厂是一个接口,那么具体工厂就是实现抽象工厂接口的类。具体工厂重写抽象工厂中的抽象方法是该方法返回具体产品的实例。
抽象工厂模式的类图如下图二所示:
图二:抽象工厂模式结构类图
1.3抽象工厂模式的优点
(1)抽象工厂可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦。
(2)使用抽象工厂模式可以方便为用户创建一系列对象。用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混用不用系列中对象。
(3)在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。
1.4适合使用抽象工厂模式的情景
(1)系统需要为用户提供多个对象,但不希望用户直接用new运算符实例化这些对象,即希望用户和创建对象脱耦。
(2)系统需要为用户提供一系列对象,但只需要知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。