23设计模式学习
1.什么設計模式
- 1.1模式是解決相似問題的核心
- 1.2設計模式軟件設計過程中解決一類問題的方案
- 總結來說:設計模式 :軟件設計過程中解決一類問題的一種方案;
2.什么是面向對象的設計模式
面向對象設計模式描述了面向對象設計過程中、特定場景下、類與相互通信的對象之間常見的組織關系、
面向對象的實現過程如下:
- 2.1 首先是抽象出類
- 2.2?然后設計出對象之間的關系
3.設計原則:
?3.1?針對接口(抽象)編程,而不是針對實現編程;
?3.2?優先使用組合 而不是使用類的繼承
?3.3封裝變化點
?3.4?使用重構得到模式
4.模式
4.1 單例模式
單例模式分為:懶漢模式和饑漢模式
? 區別:懶漢模式是使用時才創建
? ? ? ? ? ? ?饑漢模式是類初始化時加載
?
使用雙檢驗模式
package com.asiainfo.test;import java.util.HashMap;public class Singleton {private static volatile Singleton singleton=null;private Singleton() {}//防止在其他類中創建實例public static Singleton getInstance() {HashMap<String, String> hashMap = new HashMap<String,String>();if (singleton == null) { //防止已經創建實例,線程進來,有枷鎖和釋放鎖過程,造成cup 資源的浪費synchronized (Singleton.class) {//枷鎖,兩個線程同時進來,其中一個線程能獲得鎖,另一個線程只能等待if (singleton == null) { //若兩個線程都到synchronized ()這塊,這個判空就能防止,后面的那個線程在次創建一個實例singleton = new Singleton();System.out.println("進來了");}}}return singleton;} }?
?靜態加載這種方式:
package com.asiainfo.test;public class SingletonStatic {public static int a=10;public static volatile SingletonStatic singleton=null;static {singleton=new SingletonStatic();//利用靜態代碼塊實例化類System.out.println("this si a static {}");}private SingletonStatic(){ //防止其他類 實例化單例模式System.out.println("this is singletonStatic");}private static SingletonStatic getSingleton(){//獲取單例System.out.println( "this is a static method");return singleton;}public static void main(String[] args) {System.out.println(a);getSingleton();SingletonStatic singletonStatic = new SingletonStatic();}}運行結果:
this is singletonStatic this si a static {} 10 this is a static method this is singletonStatic??總結:
概括的說:靜態代碼塊在類加載時調用,并且只調用一次。
靜態代碼塊最常用的作用就是:給一個對象的屬性初始化。
具體的說:
- 1.當調用一個類的靜態變量時,這個類中的靜態代碼塊會執行?!局挥徐o態代碼塊會執行】
- 2.當調用一個 類的靜態方法時,這個類中的靜態代碼塊會執行?!局挥徐o態代碼塊會執行】
- 3.當創建一個 類的一個實例時,這個類中的靜態代碼塊、非靜態代碼塊(也叫構造代碼塊)、創建實例的相應的構造方法都會執行。
具體類的執行順序參考:https://mp.csdn.net/postedit/81100790
由于使用靜態加載staic{} 方式 ,只要調用單例的 靜態變量,或者方法就會執行靜態代碼塊,不是最優的方式
建議使用延遲加載:
該方法中Singleton 有一個靜態內部類SingletonHolder,內部類在外部加載的時候并不會加載,在有在調用getInstance才會加載
package com.asiainfo.test;public class InternalSingleton {private InternalSingleton() {}private static class SingletonHolder {//該方法中Singleton 有一個靜態內部類SingletonHolder,內部類在外部加載的時候并不會加載,在有在調用getInstance才回加載private static final InternalSingleton inst = new InternalSingleton();static {System.out.println("this internal static ");}}public static InternalSingleton getInstance() {return SingletonHolder.inst;}public static void sayHello(){System.out.println("this is hello");}public static void main(String[] args) {InternalSingleton.sayHello();getInstance();} }運行結果:
this is hello this internal static?總結:
§Singleton模式是限制而不是改進類的創建。
§理解和擴展Singleton模式的核心是“如何控制用戶使用new對一個類的構造器的任意調用”。
可以很簡單的修改一個Singleton,使它有少數幾個實例,這樣做是允許的而且是有意義的。?
4.2 建造者builder模式
?Builder模式定義:?
? ?將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示.
?Builder partA()
?Builder partB()
?Builder partC()
?ConcreteBuilder 中的 Builder part()表示產品組件具體組件實現
?Director 類中Construct() 完成組件拼裝;而不是在 concreteBuilder 中的getResult() 方法中完成,而實現了解耦過程和部件
?
?具體實例參考如下地址
?參考:https://www.jianshu.com/p/be290ccea05a
4.3.工廠模式包含:單工廠模式,工廠方法,抽象工程
- 簡單工廠:一種產品---一個工廠
- ?工廠 ? ? ? ? ?一種產品-----多個工廠
- ?抽象工廠 ? ?多種產品 ----多個工廠
抽象工廠如下圖:
?
?
總結
- 上一篇: c#操作html dom元素,C#获取与
- 下一篇: 计算机无法正常更新,无法完成更新正在撤销