設計模式的講解及使用

2021-10-08 17:00:31 字數 2490 閱讀 6216

設計模式(design pattern),是一套被反覆使用、經過分類編目的、**設計經驗的總結,使用設計模式是為了可重用**、保證**可靠性、程式的重用性。

1995 年,gof(gang of four,四人組)合作出版了《設計模式:可復用物件導向軟體的基礎》一書,共收錄了 23 種設計模式。

總體來說設計模式分為三大類:

建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:介面卡模式、裝飾器模式、**模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

單例模式又叫做單態模式,保證乙個類僅有乙個例項。

/*

* 餓漢式

* 保證次類的物件,具有唯一性

* 單例

* 1: 私有修飾構造方法

* 2: 建立本類物件,自己new自己

* 3: 公共方法,返回本類物件

*/public

class

single

private

static single s =

newsingle()

;public

static single getinstnce()

}

/*

* 懶漢式

* 保證次類的物件,具有唯一性

* 單例

* 1: 私有修飾構造方法

* 2: 建立本類物件,自己new自己

* 3: 公共方法,返回本類物件

*/public

class

single

private

static single s = null;

public

static single getinstnce()

return s;

}}

/*

* 保證次類的物件,具有唯一性

* 單例

* 1: 私有修飾構造方法

* 2: 建立本類物件,自己new自己

* 3: 公共方法,返回本類物件

*

* 懶漢式 : 出現執行緒安全問題

* if(s==null)

* 多個執行緒(cpu掛起)

* s = new single();

*/public

class

single

private

static single s = null;

public

static

synchronized single getinstnce()

return s;

}}

/*

* 保證次類的物件,具有唯一性

* 單例

* 1: 私有修飾構造方法

* 2: 建立本類物件,自己new自己

* 3: 公共方法,返回本類物件

*

* 懶漢式 : 出現執行緒安全問題

* 同步方法之後,不滿意

* 鎖太重

*

* 如果乙個執行緒,執行後,變數s 不是空,物件位址

* 當下乙個執行緒 ,再執行沒有必要在拿鎖,再判斷,直接 return

* 雙重判斷

*

*

*/public

class

single

private

static

volatile single s = null;

public

static single getinstnce()

}}return s;

}}

單例設計模式dcl,成員變數,是否需要新增關鍵字 volatile 加,必須加

volatile(修飾符) 寫在成員變數, 防止指令重排序

建立物件的指令 :

堆記憶體開闢空間 (位址)

初始化自己的成員變數 private int a = 1

先預設值0

定義值

呼叫構造方法

位址傳遞給引用變數

以上指令,按照順序進行,如果cpu出現了指令上亂序, 出現物件沒有建立完成,先將記憶體的位址賦值到引用變數

如果另乙個執行緒執行,帶走變數,沒有建立完成的物件!!

保證記憶體的可見性 : 記憶體中的資料,只要有1個執行緒進行了更新,其他執行緒都會讀取到最新的資料

乙個物件,做為同步鎖來使用,鎖會有四個狀態

重鎖 重鎖是效率底下,要和作業系統互動,將執行緒全部進入到cpu的阻塞佇列

呼叫了wait() notify() 直接公升級為重鎖

設計模式及例子講解(todo)

學習設計模式中一些簡單的筆記 為什麼要學習設計模式 我們學設計模式,是為了學習如何合理的組織我們的 如何解耦,如何真正的達到對修改封閉對擴充套件開放的效果,而不是去背誦那些類的繼承模式,然後自己記不住,回過頭來就罵設計模式把你的 搞複雜了,要反設計模式。設計模式的目的只有乙個 降低物件之間的耦合,增...

KVC設計模式講解

在objective c語言中,可以用 property和 synthesize來建立例項變數的屬性,因此物件訪問的時候可以直接使用點語法。但是,如果不宣告屬性,如何訪問到物件的例項變數呢?kvc就解決了這一問題。kvc 全稱key value coding,也就是鍵值編碼。先看下面乙個例子 int...

mysql講解及使用

非關係型資料庫 mongodb hbase neo4j 分類 語法說明 1 sql語言不嚴格區分大小寫,通常關鍵字大寫,其他小寫。2 sql語句通常以封號結束,如果是dos命令下,封號不能省略,表示一條語句結束。ddl之資料庫的操作 2 查詢伺服器上已存在的所有資料庫 語法 show databas...