設計模式——享元模式

一、介紹

“享元”中“享”是共享的意思,“元”是對象的意思,享元模式意在降低系統(tǒng)內(nèi)存占用,通過共享對象的方法提高復用。在享元模式中,當系統(tǒng)中不存在所需對象時會創(chuàng)建,如果有那么則會復用,以此達到共享的目的。

二、UML類圖

享元模式

在這個例子中,Library作為系統(tǒng)中的抽象享元對象,book作為Library的內(nèi)部狀態(tài),不隨外部環(huán)境變化而變化,屬于Library的共享對象,不同的User都可以來借閱同一個book;User作為外部狀態(tài),隨外部環(huán)境變化而變化,在調用browse方法時傳進來。LibraryManager是抽象類Library的實現(xiàn)類,具體實現(xiàn)browse方法。此外還需要建立一個LibraryFactory工廠類,以聚合的方式保存Library實現(xiàn)類對象,這樣當客戶端Client通過工廠調用Library時,如果有book那么直接取出來用,不用新建,如果沒有那么新建,放到容器中去,方便下次再來取對象。

三、代碼實例

public abstract class Library {

    private String mBook;

    public Library(String name) {
        this.mBook = name;
    }

    public String getName() {
        return mBook;
    }

    public void setName(String mName) {
        this.mBook = mName;
    }

    protected abstract void browser(User user);
}
public class LibraryManager extends Library{

    public LibraryManager(String name) {
        super(name);
    }

    @Override
    protected void browser(User user) {
        System.out.println("姓名:"+user.getName()+"  年齡:"+user.getAge()+"  借閱書籍:<<"+getName()+">>");
    }
}
public class User {

    private String name;

    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class LibraryFactory {

    private final HashMap<String, LibraryManager> map = new HashMap<>();

    public void browse(String name,User user){
        if (!map.containsKey(name)){
            map.put(name,new LibraryManager(name));
        }
        map.get(name).browser(user);
    }
}

四、總結

享元模式中,當系統(tǒng)中存在共享對象時,直接取出來復用,當系統(tǒng)中不存在時,新建一個對象返回,同時存到系統(tǒng)中方便下次取用。享元模式中分內(nèi)部狀態(tài)外部狀態(tài)兩類對象,其中內(nèi)部狀態(tài)是指不隨外部環(huán)境變化而變化的變量,是可以用來共享的,外部狀態(tài)通常由外部傳進來,隨外部環(huán)境變化而變化,不能作為共享變量。
在Java中,常見的一些池技術就是基于享元模式實現(xiàn)的,比如線程池,String類型對象的創(chuàng)建等。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 模式定義 享元模式(Flyweight Pattern)就是通過共享技術實現(xiàn)大量細粒度對象的復用。享元模式是通過細...
    smileNicky閱讀 340評論 0 0
  • UML關系簡單介紹UML簡單使用的介紹創(chuàng)建型設計模式Android設計模式-單例模式Android設計模式-工廠模...
    星宇V閱讀 859評論 0 2
  • 定義 享元模式,F(xiàn)lyweight Pattern,輕量模式?如果不熟悉,光從字面上很難能理解具體的意思,根據(jù)定義...
    程序員札記閱讀 1,261評論 0 1
  • 前言 大家都知道單例模式,通過一個全局變量來避免重復創(chuàng)建對象而產(chǎn)生的消耗,若系統(tǒng)存在大量的相似對象時,又該如何處理...
    小波同學閱讀 476評論 0 0
  • 1、定義: 運用共享技術來減少創(chuàng)建對象的數(shù)量,從而減少內(nèi)存占用、提高性能。 主要解決:在有大量對象時,有可能會造成...
    Splendid飛羽閱讀 667評論 0 1

友情鏈接更多精彩內(nèi)容