JAVA設計模式之 簡單工廠模式【Simple Factory Pattern】

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

一、概述

      定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式

      當我們需要建立各種不同物件,這些類稱為具體產品類(ConcreteProduct),而將它們公共的程式碼進行抽象和提取後封裝在一個抽象產品類或產品介面(Product)中,每一個具體產品類都是抽象產品類的子類;然後提供一個工廠類(Factory)用於建立各種產品,在工廠類中提供一個建立產品的工廠方法,該方法可以根據所傳入的引數不同建立不同的具體產品物件;客戶端只需呼叫工廠類的工廠方法並傳入相應的引數即可得到一個產品物件。而無須直接使用new關鍵字來建立物件,也就是物件的建立由工廠來幫你完成、你不需要知道他的建立過程;


二、適用場景

     (1) 工廠類負責建立的物件比較少,由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。

     (2) 客戶端只知道傳入工廠類的引數,對於如何建立物件並不關心。



三、UML類圖分析

       


四、參與者

    1、Factory (工廠角色):

         工廠角色即工廠類,它是簡單工廠模式的核心,負責實現建立所有產品例項的內部邏輯;工廠類可以被外界直接呼叫,建立所需的產品物件;

    2、Product (抽象產品類或介面):

         它是工廠類所建立的所有物件的父類,所建立的具體產品物件都是其子類物件;

    3、ConcreteProduct (具體產品角色):

         它是簡單工廠模式的建立目標;


五、用例學習

     (1)產品介面類:Product.java

/**
 * 產品介面
 * @author lvzb.software@qq.com
 *
 */
public interface Product {

}
    (2) 具體的產品類A:ConcreteProductA.java

/**
 * 具體的產品A
 * @author lvzb.software@qq.com
 *
 */
public class ConcreteProductA implements Product {

	
}
        (3) 具體的產品類B:ConcreteProductB.java

/**
 * 具體的產品B
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteProductB implements Product {

}
    (4)具體的產品類C:ConcreteProductC.java

/**
 * 具體的產品C
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteProductC implements Product {

}
    (5)生產產品的工廠類 (簡單的工廠類/靜態工廠類):ProductFactory.java

/**
 * 生產產品的工廠類 (簡單的工廠類/靜態工廠類)
 * @author  lvzb.software@qq.com
 *
 */
public class ProductFactory {
	
	/**
	 * 靜態工廠方法<br>
	 * 根據傳進來的引數的產品型別來 生產/建立 真實的產品實體物件
	 * @param productType 產品型別
	 * @return 產品實體物件
	 */
	public static Product createProduct(String productType){
		Product product = null;
		
		if ("A".equals(productType)) {
			product = new ConcreteProductA();
			System.out.println("工廠 建立了產品物件:ConcreteProductA");
		} else if ("B".equals(productType)) {
			product = new ConcreteProductB();
			System.out.println("工廠 建立了產品物件:ConcreteProductB");
		} else if ("C".equals(productType)) {
			product = new ConcreteProductC();
			System.out.println("工廠 建立了產品物件:ConcreteProductC");
		} else {
			System.out.println("沒有該型別的產品,生產產品哪家強 ? 工廠方法模式  : 抽象工廠模式");
		}
		
		return product;
	}

}
    (6)客戶端呼叫工廠類靜態方法建立產品:Client.java

public class Client {

	public static void main(String[] args) {
		ProductFactory.createProduct("A");
		ProductFactory.createProduct("C");
		ProductFactory.createProduct("B");
		ProductFactory.createProduct("D");
	}
}
    (7)執行效果如下:

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

     簡單工廠類負責了所有產品的建立邏輯,當我們需要新引進一個新產品時,就不得不修改工廠類的產品建立邏輯,在產品型別較多時有可能會造成工廠類的產品建立邏輯過於負責,不利於系統的維護性和擴充套件性;




相關文章