設計原則: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(); } }
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(); } }
簡單工廠模式的定義:提供一個
創建對象實例的功能,而無須關心其具體實現。被創建對象的類型,可以是接口,抽象類,也可以是具體的類。
簡單工廠的本質是選擇實現。優點在於幫助封裝和解耦,缺點則在於增加了客戶端復雜度以及不利於擴展子工廠。
簡單工廠常采用靜態方法來實現,所以有時被稱作靜態工廠。為了選擇實現,還可以把選擇的部分配置到配置文件當中去。
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.properties product1=No0.concreteProduct
