一、概述
定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。因爲在簡單工廠模式中用於創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。
當我們需要創建各種不同對象,這些類稱爲具體產品類(ConcreteProduct),而將它們公共的代碼進行抽象和提取後封裝在一個抽象產品類或產品接口(Product)中,每一個具體產品類都是抽象產品類的子類;然後提供一個工廠類(Factory)用於創建各種產品,在工廠類中提供一個創建產品的工廠方法,該方法可以根據所傳入的參數不同創建不同的具體產品對象;客戶端只需調用工廠類的工廠方法並傳入相應的參數即可得到一個產品對象。而無須直接使用new關鍵字來創建對象,也就是對象的創建由工廠來幫你完成、你不需要知道他的創建過程;
二、適用場景
(1) 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。
(2) 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。
三、UML類圖分析
四、參與者
1、Factory (工廠角色):
工廠角色即工廠類,它是簡單工廠模式的核心,負責實現創建所有產品實例的內部邏輯;工廠類可以被外界直接調用,創建所需的產品對象;
2、Product (抽象產品類或接口):
它是工廠類所創建的所有對象的父類,所創建的具體產品對象都是其子類對象;
3、ConcreteProduct (具體產品角色):
它是簡單工廠模式的創建目標;
五、用例學習
(1)產品接口類:Product.java
/**
* 產品接口
* @author [email protected]
*
*/
public interface Product {
}
(2) 具體的產品類A:ConcreteProductA.java
/**
* 具體的產品A
* @author [email protected]
*
*/
public class ConcreteProductA implements Product {
}
(3) 具體的產品類B:ConcreteProductB.java
/**
* 具體的產品B
* @author [email protected]
*
*/
public class ConcreteProductB implements Product {
}
(4)具體的產品類C:ConcreteProductC.java
/**
* 具體的產品C
* @author [email protected]
*
*/
public class ConcreteProductC implements Product {
}
(5)生產產品的工廠類 (簡單的工廠類/靜態工廠類):ProductFactory.java
/**
* 生產產品的工廠類 (簡單的工廠類/靜態工廠類)
* @author [email protected]
*
*/
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)運行效果如下:六、其他/擴展/優缺點
簡單工廠類負責了所有產品的創建邏輯,當我們需要新引進一個新產品時,就不得不修改工廠類的產品創建邏輯,在產品類型較多時有可能會造成工廠類的產品創建邏輯過於負責,不利於系統的維護性和擴展性;