JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】

小呂-ICE發表於2014-10-19

一、概述

    抽象工廠模式為建立一組物件提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是建立一種產品,它負責建立一族產品。


二、適用場景

    為建立一組物件提供了一種解決方案。


三、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 已建立...

六、其他/擴充套件/優缺點

    抽象工廠模式是工廠方法模式的進一步延伸。在抽象工廠模式中,增加新的產品族很方便,但是增加新的產品等級結構很麻煩。



相關文章