一、概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
二、适用场景
为创建一组对象提供了一种解决方案。
三、UML类图
四、参与者
(1) AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。如上图UML类图中的Factory。
(2) ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。如上图UML类图中的Factory1 和Factory2。
(3) AbstractProduct(抽象产品):它为每种产品声明接口,如上图UML类图中的ProductA和ProductB。
(4) ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。如上图UML类图中的ConcreteProductA1/A2/B1/B2。
五、用例学习
(1) 产品类型A接口: ProductA.java
/**
* 产品类型A接口
* @author lvzb.software@qq.com
*
*/
public interface ProductA {
}
(2)产品类型B接口: ProductB.java
/**
* 产品类型B接口
* @author lvzb.software@qq.com
*
*/
public interface ProductB {
}
(3) 具体的A类型产品A1: ConcreteProductA1.java
/**
* 具体的A类型产品A1
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductA1 implements ProductA {
public ConcreteProductA1(){
System.out.println("产品A1 已创建...");
}
}
(4) 具体的A类型产品A2: ConcreteProductA2.java
/**
* 具体的A类型产品A2
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductA2 implements ProductA {
public ConcreteProductA2() {
System.out.println("产品A2 已创建...");
}
}
(5) 具体的B类型产品B1: ConcreteProductB1.java
/**
* 具体的B类型产品B1
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductB1 implements ProductB {
public ConcreteProductB1(){
System.out.println("产品B1 已创建...");
}
}
(6) 具体的B类型产品B2: ConcreteProductB2.java
/**
* 具体的B类型产品B2
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductB2 implements ProductB {
public ConcreteProductB2(){
System.out.println("产品B2 已创建...");
}
}
(7) 创建产品的工厂接口: Factory.java
/**
* 创建产品族的工厂接口
* @author lvzb.software@qq.com
*
*/
public interface Factory {
public ProductA createProductA();
public ProductB createProductB();
}
(8) 具体的"工厂一"类:只负责生产A1、B1等1族甲级优产品: ProductFactory1.java
/**
* 具体的"工厂一"类:只负责生产A1、B1等1族甲级优产品
* @author lvzb.software@qq.com
*
*/
public class ProductFactory1 implements Factory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
(9) 具体的"工厂二"类:只负责生产A2、B2等2族乙级劣产品: ProductFactory2.java
/**
* 具体的"工厂二"类:只负责生产A2、B2等2族乙级劣产品
* @author lvzb.software@qq.com
*
*/
public class ProductFactory2 implements Factory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
(10) 客户端 Client:Client.java
public class Client {
public static void main(String[] args) {
Factory factory1 = null;
System.out.println("工厂一 是正规工厂 生产的产品是正品");
factory1 = new ProductFactory1();
factory1.createProductA();
factory1.createProductB();
System.out.println("-------------");
Factory factory2 = null;
System.out.println("工厂二 是黑工厂 生产的产品是次品");
factory2 = new ProductFactory2();
factory2.createProductA();
factory2.createProductB();
}
}
(11) 运行结果 如下:
工厂一 是正规工厂 生产的产品是正品
产品A1 已创建...
产品B1 已创建...
-------------
工厂二 是黑工厂 生产的产品是次品
产品A2 已创建...
产品B2 已创建...
六、其他/扩展/优缺点
抽象工厂模式是工厂方法模式的进一步延伸。在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。