目錄
一虎敦、創(chuàng)建型
1.單例模式
2.工廠模式
3.原型模式
二、結構型
1.享元模式
(1)傳統(tǒng)方式(展示網(wǎng)站)
(2)享元模式優(yōu)化
(3)Integer(常量池緩存-128 ~ 127)
(4)總結
2.代理模式
三比规、行為型
1.模板模式
2.職責鏈模式
(1)傳統(tǒng)方式(展示網(wǎng)站)
1.題目:做一個展示網(wǎng)站的產品,客戶端希望以三種方式來發(fā)布
--以新聞的形式
--以博客的形式
--以微信公眾號的形式
2.傳統(tǒng)方法
(1)把一個網(wǎng)站復制拷貝為3份,然后在這個基礎上進行我們的定制化功能(新聞樣式,博客,微信公眾號)
(2)然后用多個虛擬空間來進行顯示
(3)缺點并改進:
--網(wǎng)站相似度很高,網(wǎng)站項目能不能優(yōu)化成重用一個項目,不要拷貝3份重復的,造成多實例對象,浪費系統(tǒng)資源
--展示網(wǎng)站也不是高并發(fā)量的,如果高并發(fā)應該部署在不同的機器上
--整和到一個網(wǎng)站,對于CPU,內存,硬盤,數(shù)據(jù)庫都可以達到共享,減少資源占用
(2)享元模式優(yōu)化
#1.享元(Flyweight Pattern蠅量模式)
(1)運用共享技術有效支持大量細粒度的對象
(2)享元模式舉例: 1.下棋共享棋子 2.數(shù)據(jù)庫連接池 3.方法區(qū)常量池
#2.享元模式分為內部狀態(tài)和外部狀態(tài)
-內部:對象共享出來的信息,可以用hashMap模擬去重效果
-外部:是隨著環(huán)境改變而改變的,不可共享的狀態(tài)(2)圍棋例子
2.1理論上右361個空位可以放棋子庭惜,每個棋盤有兩三百個棋子對象產生距芬,
2.2如果1000萬人直播觀看圍棋比賽,那么產生對象數(shù)量不可估量循帐,單臺服務器很難支持更多粉絲觀看
2.3如果用享元模式處理框仔,棋子對象可以減少到只有到兩個實例(兩個對手)
#3.補充
(1)單例是共享內存呢,享元是通過共享對象來減少重復的對象
(3)Integer(常量池緩存-128 ~ 127)
#Integer類的valueOf的享元模式
(1)常量池會緩存-128 ~ 127的整型,執(zhí)行速度比new Integer(127)快
(2)如果Integer z = Integer.valueOf(num); num的范圍在緩存范圍內,則會從緩存中取Integer對象,不會new
(3)所以兩個Integer.valueOf(127)返回的對象用==比較地址的時候是相等的,返回true
public static void main(String[] args) {
Integer x = Integer.valueOf(127); // 裝箱(valueOf)--得到類型為Integer的x實例
Integer y = new Integer(127); // 裝箱(new)--得到類型為Integer的x實例
Integer z = Integer.valueOf(127);
Integer w = new Integer(127);
System.out.println(x.equals(y)); // true
System.out.println(x == y); // false
System.out.println(x == z); // true (常量池會緩存-128 ~ 127的整型)
System.out.println(w == x); // false
System.out.println(w == y); // false
}
//Integer.java的源碼
// low ~ high范圍內的緩存
static final int low = -128;
static final int high;
static final Integer cache[];
static {int h = 127;
high = h;
cache = new Integer[(high - low) + 1];
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
...........
}
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) // 在緩存范圍內,則從cache取
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i); // 否則new 一個返回
}
(4)總結
(1)享元模式,"享"代表共享,"元"代表對象,系統(tǒng)中有大量的重復對象,可以使用唯一的標識來標記,比如hashMap,HashTable
(2)優(yōu)點:享元模式減少了對象的創(chuàng)建,減少了內存的占用,提高效率
(3)缺點:提高了系統(tǒng)的復雜度,需要分離出內部狀態(tài)和外部狀態(tài),并且需要工廠類進行控制(工廠類一般只獲得固有共有的部分)
(4)場景:String常量池,數(shù)據(jù)庫連接池,直播圍棋,網(wǎng)站切換不同樣式