享元模式 定義 運用共用技術有效的支持大量細粒度的對象。 UML圖 舉個慄子 實際開發當中,一個項目如果做得好,如果市場打通到其他地方,那麼核心代碼其實是可以通用的,只不過用著不同的數據和特性出來的模版而已,這些對用戶來說是非透明的。使用最小的開銷獲得最大的收益,這是所有公司的目的。 Talk is ...
享元模式
定義
運用共用技術有效的支持大量細粒度的對象。
UML圖
舉個慄子
實際開發當中,一個項目如果做得好,如果市場打通到其他地方,那麼核心代碼其實是可以通用的,只不過用著不同的數據和特性出來的模版而已,這些對用戶來說是非透明的。使用最小的開銷獲得最大的收益,這是所有公司的目的。
Talk is cheap, show me the code
(屁話少說,放碼過來)
/**
* 網站抽象類
* Created by callmeDevil on 2019/12/15.
*/
public abstract class WebSite {
public abstract void use(User user);
}
/**
* 具體網站類
* Created by callmeDevil on 2019/12/15.
*/
public class ConcreteWebSite extends WebSite{
private String name = "";
public ConcreteWebSite(String name){
this.name = name;
}
@Override
public void use(User user) {
System.out.println("網站分類:" + name + " 用戶:" + user.getName());
}
}
/**
* 網站工廠
* Created by callmeDevil on 2019/12/15.
*/
public class WebSiteFactory {
private HashMap<String, WebSite> flyweights = new HashMap<>();
// 獲得網站分類
public WebSite getWebSiteCategory(String key){
// 判斷是否存在這個對象,如果存在則直接返回,若不存在則實例化再返回
if (!flyweights.containsKey(key)) {
flyweights.put(key, new ConcreteWebSite(key));
}
return flyweights.get(key);
}
// 獲得網站分類總數
public int getWebSiteCount(){
return flyweights.size();
}
}
/**
* 用戶
* Created by callmeDevil on 2019/12/15.
*/
public class User {
private String name;
public User(String name){
this.name = name;
}
// 省略 get set
}
public class Test {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
WebSite fx = factory.getWebSiteCategory("產品展示");
fx.use(new User("路飛"));
// 共用上方生成的對象,不再實例化
WebSite fy = factory.getWebSiteCategory("產品展示");
fy.use(new User("索隆"));
WebSite fz = factory.getWebSiteCategory("產品展示");
fz.use(new User("山治"));
WebSite fl = factory.getWebSiteCategory("博客");
fl.use(new User("娜美"));
WebSite fm = factory.getWebSiteCategory("博客");
fm.use(new User("烏索普"));
WebSite fn = factory.getWebSiteCategory("博客");
fn.use(new User("喬巴"));
// 統計實例化個數,結果應為2
System.out.println("網站分類總數為:" + factory.getWebSiteCount());
}
}
運行結果
網站分類:產品展示 用戶:路飛
網站分類:產品展示 用戶:索隆
網站分類:產品展示 用戶:山治
網站分類:博客 用戶:娜美
網站分類:博客 用戶:烏索普
網站分類:博客 用戶:喬巴
網站分類總數為:2
總結
好處
享元模式可以避免大量非常相似的類的開銷。在程式設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例除了幾個參數外基本相同的,有時就能夠受大幅度的減少需要實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳進來,就可以通過共用大幅度的減少單個實例的數目。
使用情景
- 如果一個應用程式使用了大量的對象,而大量的這些對象造成了很大存儲開銷時就應該考慮應用
- 對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共用對象取代很多組對象,此時可以考慮應用。