1、 简介:为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类。抽象工厂模式通常是用于创创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。
2、 抽象工厂UML图
3、抽象工厂示意性类图
4、类图分析
从上图可以看出,抽象工厂模式涉及到以下四个角色
4、1:抽象工厂:担任这个角色的是工厂方法模式的核心,它与应用无关,任何在模式中创建对象的工厂都必须实现这个接口,在实际应用中,这个角色由java抽象类或接口来实现
4、2:具体工厂:担任这个角色的是抽象工厂的具体实现类,具体工厂含有业务逻辑,并受到客户端的调用创建产品对象,这个角色由java类来实现。
4、3:抽象产品:这个角色是工厂方法模式创建的对象的超类型(父类),在实际应用中,由java抽象类或是接口来实现
4、4:具体产品:这个角色实现了抽象产品角色声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
5、源代码
5.1:声明一个抽象产品接口 ProductA 作为A产品族的父类
package AbstractFactory; /** * ******************************************************** * @ClassName: Product * @Description: 商品A接口 * ********************************************************** */ public interface ProductA { public void say(); }
5.2:声明一个抽象产品接口 ProductB 作为B产品族的父类
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductB * @Description: 商品B接口 * ********************************************************** */ public interface ProductB { public void say(); }
5.3:创建具体产品ProductA1 实现接口ProductA
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductA1 * @Description: 具体产品类ProductA1 * ********************************************************** */ public class ProductA1 implements ProductA{ public void say(){ System.out.println("ProductA1"); } }
5.4:创建具体产品ProductA2 实现接口ProductA
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductA1 * @Description: 具体产品类ProductA2 * ********************************************************** */ public class ProductA2 implements ProductA{ public void say(){ System.out.println("ProductA2"); } }
5.5:创建具体产品ProductB1 实现接口ProductB
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductA1 * @Description: 具体产品类ProductB1 * ********************************************************** */ public class ProductB1 implements ProductB{ public void say(){ System.out.println("ProductB1"); } }
5.6:创建具体产品ProductB2 实现接口ProductB
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductA1 * @Description: 具体产品类ProductB2 * ********************************************************** */ public class ProductB2 implements ProductB{ public void say(){ System.out.println("ProductB2"); } }
5.7:创建实例化等级1产品的具体工厂类Product1Factory 实现IFactory工厂接口
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductAFactory * @Description: 等级为1的产品族具体工厂类 * ********************************************************** */ public class Product1Factory implements IFactory{ public ProductA factoryA(){ return new ProductA1(); } public ProductB factoryB(){ return new ProductB1(); } }
5.8:创建实例化等级2产品的具体工厂类Product2Factory 实现IFactory工厂接口
package AbstractFactory; /** * ******************************************************** * @ClassName: ProductAFactory * @Description: 等级为2的产品族具体工厂类 * ********************************************************** */ public class Product2Factory implements IFactory{ public ProductA factoryA(){ return new ProductA2(); } public ProductB factoryB(){ return new ProductB2(); } }
5.9:创建抽象工厂测试类
package AbstractFactory; /** * ******************************************************** * @ClassName: AbstractFactoryTest * @Description: 抽象工厂测试类 * ********************************************************** */ public class AbstractFactoryTest { public static void main(String[] args) { //分别获取两个工厂对象 IFactory factory1 = new Product1Factory(); IFactory factory2 = new Product2Factory(); ProductA productA1 = factory1.factoryA(); ProductB productB1 = factory1.factoryB(); ProductA productA2 = factory2.factoryA(); ProductB productB2 = factory2.factoryB(); productA1.say(); productB1.say(); productA2.say(); productB2.say(); } }
5.10:运行结果如下