http://blog.csdn.net/janice0529/article/details/40268217
一、概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
二、适用场景
为创建一组对象提供了一种解决方案。
三、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 [email protected]
- *
- */
- public interface ProductA {
- }
- /**
- * 产品类型B接口
- * @author [email protected]
- *
- */
- public interface ProductB {
- }
- /**
- * 具体的A类型产品A1
- * @author [email protected]
- *
- */
- public class ConcreteProductA1 implements ProductA {
- public ConcreteProductA1(){
- System.out.println("产品A1 已创建...");
- }
- }
- /**
- * 具体的A类型产品A2
- * @author [email protected]
- *
- */
- public class ConcreteProductA2 implements ProductA {
- public ConcreteProductA2() {
- System.out.println("产品A2 已创建...");
- }
- }
- /**
- * 具体的B类型产品B1
- * @author [email protected]
- *
- */
- public class ConcreteProductB1 implements ProductB {
- public ConcreteProductB1(){
- System.out.println("产品B1 已创建...");
- }
- }
- /**
- * 具体的B类型产品B2
- * @author [email protected]
- *
- */
- public class ConcreteProductB2 implements ProductB {
- public ConcreteProductB2(){
- System.out.println("产品B2 已创建...");
- }
- }
- /**
- * 创建产品族的工厂接口
- * @author [email protected]
- *
- */
- public interface Factory {
- public ProductA createProductA();
- public ProductB createProductB();
- }
- /**
- * 具体的"工厂一"类:只负责生产A1、B1等1族甲级优产品
- * @author [email protected]
- *
- */
- public class ProductFactory1 implements Factory {
- @Override
- public ProductA createProductA() {
- return new ConcreteProductA1();
- }
- @Override
- public ProductB createProductB() {
- return new ConcreteProductB1();
- }
- }
- /**
- * 具体的"工厂二"类:只负责生产A2、B2等2族乙级劣产品
- * @author [email protected]
- *
- */
- public class ProductFactory2 implements Factory {
- @Override
- public ProductA createProductA() {
- return new ConcreteProductA2();
- }
- @Override
- public ProductB createProductB() {
- return new ConcreteProductB2();
- }
- }
- 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();
- }
- }
- 工厂一 是正规工厂 生产的产品是正品
- 产品A1 已创建...
- 产品B1 已创建...
- -------------
- 工厂二 是黑工厂 生产的产品是次品
- 产品A2 已创建...
- 产品B2 已创建...
六、其他/扩展/优缺点
抽象工厂模式是工厂方法模式的进一步延伸。在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。