享元模式
定義
運用共享技術有效的支持大量細粒度的物件,
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
總結
好處
享元模式可以避免大量非常相似的類的開銷,在程式設計中,有時需要生成大量細粒度的類實體來表示資料,如果能發現這些實體除了幾個引數外基本相同的,有時就能夠受大幅度的減少需要實體化的類的數量,如果能把那些引數移到類實體的外面,在方法呼叫時將它們傳進來,就可以通過共享大幅度的減少單個實體的數目,
使用情景
- 如果一個應用程式使用了大量的物件,而大量的這些物件造成了很大存盤開銷時就應該考慮應用
- 物件的大多數狀態可以外部狀態,如果洗掉物件的外部狀態,那么可以用相對較少的共享物件取代很多組物件,此時可以考慮應用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/32492.html
標籤:設計模式
