您的位置:首页 > 编程语言 > Java开发

JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】

2014-10-19 20:44 671 查看
一、概述

    抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。

二、适用场景

    为创建一组对象提供了一种解决方案。

三、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 已创建...
六、其他/扩展/优缺点

    抽象工厂模式是工厂方法模式的进一步延伸。在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息