標籤:優勢 rod factory 執行個體 interface factor 耦合 專註 工廠
設計原則:SOLID 可以說,五個設計原則各司其職。
單一職責原則(S):用於類的設計
開閉原則(O):總的指導思想
裡氏替換原則(L):用於指導類繼承的設計
介面隔離原則(I):用於指導介面的設計
依賴翻轉原則(D):用於指導如何抽象
類之間的關係:
繼承=實現>組合>彙總>關聯>依賴
UML表現:
繼承:帶三角箭頭的實線,箭頭指向父類實現:帶三角箭頭的虛線,箭頭指向介面組合:帶實心菱形的實線,菱形指向整體彙總:帶空心菱形的實線,菱形指向整體關聯:帶普通箭頭的實線,指向被擁有者依賴:帶普通箭頭的虛線,指向被使用者簡單說明一下,《1》繼承和實現是java內建的,屬於強耦合關係;《2》組合和彙總是特殊的關聯關係,關聯關係體現在代碼上就是作為成員變數,彙總關係要強於關聯關係,代碼上往往會通過set()方法完成對成員變數的賦值,組合關係則更加強一些,往往在建構函式就完成了初始化,也就是說,在一般情況下,生命週期上組合>彙總>關聯;《3》依賴和關聯恰恰相反,代碼上一般不出現在成員變數。常見於局部變數、方法的參數或者對靜態方法的調用。 設計模式:(經典23式)設計模式的核心在於複用,如果單用,則成為累贅。
第零式 簡單原廠模式。預備知識:介面
介面能夠隔離封裝,為系統的可插拔性提供保證。在介面也抽象類別的選擇上,應該優先選擇介面,只有需要為子類提供公用功能的時候,才需要考慮抽象類別。
下面舉個例子,說明介面的具體實現。
public interface product { public void createProduct();}public class conCreteProduct implements product { @Override public void createProduct() { // TODO Auto-generated method stub System.out.println("生產產品"); }}public class user { public static void main(String[] args) { // TODO Auto-generated method stub product prod1 = new conCreteProduct(); prod1.createProduct(); }}上面這個例子雖然使用了介面隔離(並沒有完全隔離),但是還是存在一些問題。那就是user需要知道具體實現。這樣user和具體產品就存在著耦合關係。而增加一個工廠類則可以達到解除耦合的目的。
public interface product { public void createProduct();}public class conCreteProduct implements product { @Override public void createProduct() { // TODO Auto-generated method stub System.out.println("生產產品"); }}public class factory { public void createProduct() { product prod1 = new conCreteProduct(); prod1.createProduct(); }}public class user { public static void main(String[] args) { // TODO Auto-generated method stub factory fact1 = new factory(); fact1.createProduct(); }}增加了factory類以後,user就可以不需要關注具體實現了。把生產商品的事情交給了工廠來處理。而自己則專註於消費產品就可以了。這對於一個產品來說,的確是得不償失的。但如果產品的種類多的話,優勢還是很明顯的(user不需要考慮繁瑣的建立過程)。 簡單原廠模式的定義:提供一個建立對象執行個體的功能,而無須關心其具體實現。被建立對象的類型,可以是介面,抽象類別,也可以是具體的類。 簡單工廠的本質是選擇實現。優點在於協助封裝和解耦,缺點則在於增加了用戶端複雜度以及不利於擴充子工廠。 簡單工廠常採用靜態方法來實現,所以有時被稱作靜態工廠。為了選擇實現,還可以把選擇的部分配置到設定檔當中去。
public interface product { public void makeProduct();}public class concreteProduct implements product { @Override public void makeProduct() { // TODO Auto-generated method stub System.out.println("中國製造"); }}public class factory { public static product makeProduct() { Properties pro = new Properties(); InputStream in = null; try { in = factory.class.getResourceAsStream("factory.properties"); pro.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } product prod = null; try { prod = (product) Class.forName(pro.getProperty("product1")).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return prod; } }public class user { public static void main(String[] args) { // TODO Auto-generated method stub product prod = factory.makeProduct(); prod.makeProduct(); }}設定檔factory.propertiesproduct1=No0.concreteProduct
java物件導向與設計模式(一)