JAVA設計模式之 工廠方法模式【Factory Method Pattern】

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

一、概述

    定義一個用於建立物件(Product)的工廠介面(Factory),讓子類(ProductFactoryA/ProductFactoryB)決定將哪一個類(ConcreteProductA/ConcreteProductB)例項化。工廠方法模式讓一個類的例項化延遲到其子類。提供一個抽象工廠介面來宣告抽象工廠方法,而由其子類來具體實現工廠方法,建立具體的產品物件,工廠方法模式是一種類建立型模式。


二、適用場景

    (1)  客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;

    (2)  抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件;


三、UML類圖分析


四、參與者

    (1)    Product(抽象產品):它是定義產品的介面;

    (2)    ConcreteProduct(具體產品):

它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。UML圖中的ConcreteProductA 和 ConcreteProductB 都是具體產品;

    (3)    Factory(抽象工廠):在抽象工廠類中,宣告瞭工廠方法(Factory Method),用於建立一個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面;

    (4)    ConcreteFactory(具體工廠):它是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並可由客戶端呼叫,返回一個具體產品類的例項。UML圖中的ProductFactoryA 和 ProductFactoryB 都是具體工廠;


五、用例學習

    (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 {

	public ConcreteProductA(){
		System.out.println("產品A 已建立...");
	}
}

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

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

	public ConcreteProductB() {
		System.out.println("產品B 已建立...");
	}
}

    (4) 建立產品的工廠介面:Factory.java

/**
 * 建立產品的工廠介面
 * @author  lvzb.software@qq.com
 *
 */
public interface Factory {
	
	/** 
	 * 建立具體產品實體的方法
	 * @return
	 */
	public Product createProduct();

}

    (5) 具體的A產品工廠類:ProductFactoryA.java

/**
 * 具體的A產品工廠類:只負責生產A產品(ConcreteProductA)
 * @author  lvzb.software@qq.com
 *
 */
public class ProductFactoryA implements Factory {

	@Override
	public Product createProduct() {
		return new ConcreteProductA();
	}

}

    (6) 具體的B產品工廠類:ProductFactoryB.java

/**
 * 具體的B產品工廠類:只負責生產B產品(ConcreteProductB)
 * @author  lvzb.software@qq.com
 *
 */
public class ProductFactoryB implements Factory {

	@Override
	public Product createProduct() {
		return new ConcreteProductB();
	}

}

    (7) 負責呼叫工廠類生產產品的客戶端:Client.java 

public class Client {

	public static void main(String[] args) {
		Factory factory = null;
		
		factory = new ProductFactoryA();
		Product productA = null;
		productA = factory.createProduct();
		
		factory = new ProductFactoryB();
		Product productB = null;
		productB = factory.createProduct();
		
	}
}
    (8) 執行結果如下:

    產品A 已建立...

    產品B 已建立...

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

    工廠方法模式是對簡單工廠模式的設計優化,簡單工廠模式中 如果新增一類產品型別時,需要修改工廠靜態方法的產品建立邏輯,而使用工廠方法模式只需新擴充套件出一個新的工廠子類或是實現類來針對新增型別產品的建立工作、使系統具有了良好的擴充套件性與維護性;


下篇預告:小呂將學習和介紹 抽象工廠模式



相關文章