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分。決策了一下決定去打第一題。想了一下決定打乙個偽吉司機線段樹操作什麼的比較簡單,...