创建型模式-抽象工厂方法模式
目录
1.抽象工厂方法模式概述
1.1概念
抽象工厂方法模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂方法模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂方法模式又称为Kit模式,数据对象创建型模式。在抽象工厂方法模式中,引入了产品等级结构和产品族的概念。
抽象工厂方法模式相当于对工厂方法模式的单一性进行了升级。实现了低耦。
产品等级结构 指的是抽象产品与具体产品所构成的继承层次关系。 产品族 指的是同一个工厂所生产的一系列产品,即位于不同产品等级结构且功能相关联的
产品所组成的家族。
1.2产品等级结构和产品族
其概念如下图所示:
1.2类图
类图如下所示:
1.3角色
角色如下:
AbstractFactory 表示抽象工厂,用于声明创建抽象产品的方法,即工厂方法。 ConcreteFactory1 表示具体工厂,实现了抽象工厂声明的抽象工厂方法,用于创建具体产品。 ConcreteFactory2 表示具体工厂,实现了抽象工厂声明的抽象工厂方法,用于创建具体产品。 AbstractProductA 表示抽象产品,为每一种产品声明接口。 AbstractProductB 表示抽象产品,为每一种产品声明接口。 ProductA1 表示具体产品,定义具体工厂创建的具体产品对象类型,实现产品接口。 ProductA2 表示具体产品,定义具体工厂创建的具体产品对象类型,实现产品接口。 ProductB1 表示具体产品,定义具体工厂创建的具体产品对象类型,实现产品接口。 ProductB2 表示具体产品,定义具体工厂创建的具体产品对象类型,实现产品接口。 Client 表示客户端。
2.抽象工厂方法模式实现原理
简单工厂模式专门定义一个类来负责创建其他类的实例,这个类成为工厂类,被创建的类的实例通常都具有共同的父类。
下面以生产宝马,奥迪汽车和消费者消费汽车为实例:
抽象工厂:interface AbstractFactory Trunk produceTrunk(); Sedan produceSedan(); 具体工厂:宝马工厂(BaoMaFactory) Trunk produceTrunk(); //生成宝马卡车 Sedan produceSedan(); //生成宝马轿车 奥迪工厂(AoDiFactory) Trunk produceTrunk(); //生成奥迪卡车 Sedan produceSedan(); //生成奥迪轿车 抽象产品:卡车(Trunk) 轿车(Sedan) 具体产品:宝马卡车,宝马轿车 奥迪卡车,奥迪轿车
抽象卡车汽车接口类:
/** * 抽象轿车接口 * @author Administrator */ public interface Sedan { //轿车启动方法 public void run(); }
抽象轿车汽车接口类:
/** * 抽象卡车接口 * @author Administrator */ public interface Trunk { //卡车启动方法 public void run(); }
宝马卡车产品具体类:
/** * 宝马卡车具体产品类 * @author Administrator */ public class BaoMaTrunk implements Trunk{ @Override public void run() { System.out.println("宝马卡车启动"); } }
宝马轿车产品具体类:
/** * 宝马轿车具体产品类 * @author Administrator */ public class BaoMaSedan implements Sedan{ @Override public void run() { System.out.println("宝马轿车启动"); } }
奥迪卡车产品具体类:
/** * 宝马卡车具体产品类 * @author Administrator */ public class AoDiTrunk implements Trunk{ @Override public void run() { System.out.println("奥迪卡车启动"); } }
奥迪轿车产品具体类:
/** * 宝马轿车具体产品类 * @author Administrator */ public class AoDiSedan implements Sedan{ @Override public void run() { System.out.println("奥迪轿车启动"); } }
汽车抽象工厂接口:
/** * 汽车抽象工厂接口 * @author Administrator */ public interface CarFactory { //生成卡车方法 public Trunk produceTrunk(); //生成轿车方法 public Sedan ProduceSedan(); }
宝马汽车具体工厂类:
/** * 宝马汽车具体工厂类 * @author Administrator */ public class BaoMaFactory implements CarFactory{ @Override public Trunk produceTrunk() { //返回宝马卡车实例对象 return new BaoMaTrunk(); } @Override public Sedan ProduceSedan() { //返回奥宝马卡车实例对象 return new BaoMaSedan(); } }
奥迪汽车具体工厂类:
/** * 奥迪汽车具体工厂类 * @author Administrator */ public class AoDiFactory implements CarFactory{ @Override public Trunk produceTrunk() { //返回奥迪卡车实例对象 return new AoDiTrunk(); } @Override public Sedan ProduceSedan() { //返回奥迪轿车实例对象 return new AoDiSedan(); } }
消费者类:
/** * 消费者厂类 * @author Administrator */ public class Customer { public static void main(String[] args) { CarFactory baoma = new BaoMaFactory(); baoma.produceTrunk().run(); baoma.ProduceSedan().run(); CarFactory aodi = new AoDiFactory(); aodi.produceTrunk().run(); aodi.ProduceSedan().run(); } }
运行结果:
3.抽象工厂方法模式优缺点
当抽象工厂方法模式是所有工厂模式最一般的形式。当抽象工厂方法模式退化到只有一个产品等级结构的时候,就变成了工厂方法模式;当工厂方法模式的工厂类只有一个,且工厂方法为静态方法时,就变成了简单工厂模式。
3.1优点
实现高内聚低耦合 增加新的产品族很容易,只需要增加一个新的具体工厂类,并在相应的产品等级结构中增加对应的具体产品类即可。 工厂方法模式隔离了具体类的生成,使得客户端并不需要知道什么样的对象被创建。用于这样的隔离,使得更换一个具体工厂就变得容易。 3.2缺点
增加新的产品等级结构很困难,需要修改抽象工厂接口和已有的具体工厂类,这个特点成为开闭原则的倾斜性。它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。