為什么需要創建型模式以及簡單工廠模式(二)


 

創建型模式  

創建型模式不同於其他模式,因為程序語言本身是支持創建對象實例的 
比如使用new關鍵字,比如通過反射創建,通過clone()方法創建對象
也可以在構造方法中對創建邏輯進行干預
那么,為什么還需要創建型模式?  

創建型概念特點

先看下前文說過的創建型模式概念
創建型模式是用來創建對象的模式,抽象了實例化的過程,封裝了創建邏輯
1. 將系統所使用的具體類的信息封裝起來
2. 隱藏了類的實例是如何被創建和組織的
 
實例的創建與使用分離
創建型模式的最基本功能就是將對象的創建和使用進行了分離
客戶端程序不在關注對象的創建,通過創建型模式進行對象的獲取
對象的創建和使用分離就能保證,對象的創建過程全部都被封裝在創建型模式之中了
不再會散亂的存在於使用的類中, 更加便於維護,也符合依賴倒置原則
 
隱藏細節類型
一旦使用創建型模式,就 對客戶端程序隱藏了對象創建的細節
甚至可以隱藏對象的具體類型,客戶端程序可以僅僅面向抽象編程即可
不需要關注實際使用對象的具體類型, 降低了耦合度
 
邏輯清晰 個性化
構造方法雖然可以封裝創建初始化邏輯
但是,構造方法全都是一樣的名字,使用創建型模式---比如工廠模式的話,你哪怕什么都不做
只是給多種用途的構造方法設置更加有自解釋含義清晰的名字,都會 增加可讀性
另外
比如創建型的單例模式,僅僅返回一個對象的實例,如果將這種邏輯植入到構造方法中
將會顯得不倫不類,因為new關鍵字構造方法就是單純的創建對象
不應該將過多的業務邏輯植入其中,它僅適合用於一些初始化操作
使用單獨的創建型模式, 邏輯更加清晰
 

場景

當你需要對客戶端程序 隱藏實際的對象類型時
當你想要 隱藏實例對象的業務創建邏輯時
當你想要 把對象的使用與創建進行分離時
等等想要 更加個性化定制對象的創建過程的時候
都可以考慮使用創建型模式   
 

簡單工廠模式


而工廠模式是簡單常用的一種創建型模式

概念

工廠模式是最基本的創建型模式,他有三種形式, 簡單工廠,工廠方法,抽象工廠
其中最基本的是簡單工廠形式, 簡單工廠形式簡單到很多時候不被稱為一種模式,更像是一種經驗習慣 
簡單工廠模式借助於工廠類的靜態方法,根據參數的不同情況創建不同的對象
簡言之就是:有一個類,他有一個靜態方法, 這個靜態方法根據條件判斷需要創建的對象的類型
 

示例代碼

考慮下面的這種場景
有水果類(抽象類、接口)Fruit用於描述水果
另有具體的水果(實現類)蘋果Apple 橘子Orange
有一個簡單的水果店SimpleFruitFactory 能夠銷售提供所有的水果
image_5be1399f_7e53
ps:包名不應該有大寫,應該盡可能地使用一個單詞,實在無法避免也不要駝峰命名,全部小寫
 
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public interface Fruit {
String description();
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class Apple implements Fruit {
@Override
public String description() {
return "apple";
}
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class Orange implements Fruit {
@Override
public String description() {
return "Orange";
}
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public enum FruitType {
APPLE,
ORANGE
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class SimpleFruitFactory {
public static Fruit create(FruitType fruitType){
if(fruitType.equals(FruitType.APPLE)){
return new Apple();
}else if(fruitType.equals(FruitType.ORANGE)){
return new Orange();
}
return null;
}
}
測試代碼
image_5be1399f_4868

結構

通過示例可以看得出來,簡單工廠模式的確很簡單
關鍵點就是這個靜態create方法,內部使用if else結構或者switch結構
由於通常都是靜態方法,所以又叫做靜態工廠方法模式
模式如下圖所示
 
image_5be1399f_34dd
工廠類根據傳入的參數決定創建哪一種類型的具體產品
工廠類Factory
一般就是具體的Java實現類,在客戶端程序的請求下直接創建具體的產品,提供靜態工廠方法
抽象產品 Product
工廠所創建對象的父類或者公共接口,一般是接口或者抽象類
具體產品 ConcreteProduct
創建的具體的實例對象
 

特點

簡單工廠模式特點:
靜態方法根據參數確定待創建對象的類型
當然,也可以不在一個方法中處理, 也可以創建多個方法來創建不同的具體產品對象
 
而且,如果產品只有一種的話,也可以省略抽象的產品Product角色
image_5be1399f_54d5
 
簡單工廠模式 處於產品實例化的核心位置
他知道每個產品,也就是內部直接清楚創建的對象類型
他決定哪一個產品類應該被實例化
允許客戶端程序與具體產品的創建過程獨立,在系統引入新產品時,不需要修改客戶端代碼
所以說站在客戶端程序的視角看待的話, 算是符合開閉原則
對於簡單的場景,簡單工廠模式是一個不錯的選擇,既能夠獲得工廠型模式的優點
又足夠的簡便清晰
 
簡單工廠模式根本特點就是一個工廠類包打天下,創建所有的產品
 

簡單工廠模式缺點

既然叫做簡單工廠模式,他的優點之一自然是簡單
所有的創建邏輯都封裝在了一個工廠類中,以不變應萬變,所有產品的創建都盡在其中
但是 面對復雜的產品體系結構,優點就變成了缺點 ,可能就會過於臃腫復雜不易維護復用
 
比如,如果新增加了子類,怎么辦?
顯然需要修改工廠的靜態方法
想要擴展功能必須修改工廠類的代碼,也就是 站在工廠類的角度,不符合開閉原則
而且,面對復雜的產品體系結構,這個工廠類提供所有的創建邏輯
成了一個功能大而全的類,顯然這 違背了單一職責原則
也會更容易出現問題
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM