設計模式 2 23

2021-10-06 14:35:23 字數 3729 閱讀 3649

2. 工廠方法模式

工廠方法模式

參考行為模式

定義提供建立物件的方式,確保只有乙個物件被建立。

意義節約資源。

缺點引入了執行緒安全問題。設計

實現方法對比

實現執行緒安全

延遲載入

效能序列化/反射

餓漢式y

y懶漢式:無鎖yy

懶漢式:有鎖yy

雙重檢查yy

y靜態內部類yy

y列舉yy

y擴充套件雙重檢測的指令重排問題:volatile。避免指令重排

非列舉實現的序列化問題:實現readresolve。大致原理淺拷貝

// 如餓漢式

private

singleton()

private

static singleton instance =

newsingleton()

;public

static singleton getinstance()

private object readresolve()

實現構造方法私有化

// 1. 餓漢式

private

static singleton instance =

newsingleton()

;public

static singleton getinstance()

// 2.1 懶漢式無鎖

private

static singleton instance = null;

public

static singleton getinstance()

return instance;

}// 2.2 懶漢式有鎖

public

static

synchronized singleton getinstance()

return instance;

}// 3. 雙重檢測:指令重排可能導致不安全

private

static singleton instance = null;

public

static singleton getinstance()

}}return instance;

}// 3.2 雙重檢測(2)

private

volatile

static singleton instance = null;

// 4. 靜態內部類

private

static

class

inner

public

static singleton getinstance()

// 5. 列舉

public

enum singleton

參考

面試官所認為的單例模式——咖啡拿鐵

漫畫:什麼是單例模式——程式設計師小灰

更新時間1:2020.05.28

簡單工廠模式:靜態方法模式

定義提供靜態方法,建立其他類例項。通常根據引數不同建立不同的類例項。

角色抽象產品:abstractproduct

具體產品:producta、productb…

工廠類:factory

意義建立與使用物件分隔開,使用者只需傳相應引數即可獲取對應物件,實現了解耦。

缺點違背「開放-關閉」原則。新增新產品則需要修改工廠類的邏輯。

簡單工廠使用靜態方法,無法形成繼承關係的類體系。

實現

class

abstractproduct

class

producta

extends

abstractproduct

}class

productb

extends

abstractproduct

// 靜態工廠

class

factory

else

if(product.

equals

("b"))

}}

// main

abstractproduct proa = factory.

getproduct

("a");

proa.

use(

);

工廠方法模式

定義產品族和工廠族一一對應,一種具體產品對應乙個具體工廠。

如:汽車產品族:car(大卡車、小汽車)

汽車工廠族:ca***ctory(大卡車工廠、小汽車工廠)

角色抽象產品:car

具體產品:bigcar、smallcar

抽象工廠:ca***ctory

具體工廠:bigca***ctory、smallca***ctory

意義新增同族產品,只需新增乙個產品和工廠實現類,繼承各自抽象父類即可,擴充套件性更好。

缺點複雜性相對高(需要實現兩個類)

實現

class

carclass

bigcar

extends

carclass

smallcar

extends

car// 工廠方法

class

ca***ctory

class

bigca***ctory

extends

ca***ctory

}class

smallca***ctory

extends

smallca***ctory

參考

graphic design patterns

更新時間2:2020.05.29

定義針對一組演算法,封裝到具有共同介面的類中,從而根據條件選擇不同的實現。

角色抽象策略類

具體策略類

上下文類

優點靈活。對於某些具體場景,存在需求變更,新增策略即可,然後客戶端選擇對應並呼叫。

缺點客戶端需知道所有的策略類,並決定呼叫哪個類。

實現

// 抽象策略及實現

class

strategy

class

normalstrategy

extends

strategy

}class

discountstrategy

extends

strategy

}// 上下文

class

context

public bigdecimal price()

}// 或者工廠

class

context

else

if(strategy ==2)

}public bigdecimal price()

}

// main

context context =

newcontext(1

);bigdecimal price = context.

price()

;

參考

《大話設計模式》

graphic degisn patterns

更新時間3:2020.05.30

淺學設計模式之裝飾模式 (2 23)

裝飾模式就是動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。對於人來說,衣服 鞋子 領帶 襪子等都是裝飾,裝飾模式就是給光著身子的人穿上各種衣服褲子。對於程式物件來說,每乙個功能都是裝飾,給乙個類增加功能,就是給這個類進行裝飾。compoent是乙個物件介面,可以給這...

223 概率統計

現象 特點概念 樣本空間s 樣本點w 複雜事件 隨機事件 分類事件間的關係 互斥事件 ab 差事件對立事件 積事件和事件 對立事件和互斥事件間關係 兩事件獨立性 定理一 事件a b獨立的充要條件 定理二推廣 計算時間的運算滿足的規律 事件的概率和頻率 概率性質 特殊的概率 定義性質 計算乘法公式 全...

2 23考試小記

上來看到第一道題第一問好像是一道很簡單的線段樹操作,看了第二問發現並沒有那麼簡單,但暴力30分還是穩得,第二題暴力也是30分,但對於正解沒想到什麼,第三題第一問明顯lct,第二問從來沒有見過類似的,貌似暴力不好得滿30分。決策了一下決定去打第一題。想了一下決定打乙個偽吉司機線段樹操作什麼的比較簡單,...