1. 程式人生 > >享元模式與單例模式區別

享元模式與單例模式區別

單例模式是類級別的,一個類只能有一個物件例項;

享元模式是物件級別的,可以有多個物件例項,多個變數引用同一個物件例項;

享元模式主要是為了節約記憶體空間,提高系統性能,而單例模式主要為了可以共享資料;

1:單例模式

public class Singleton {
    // 我來寫一個單例模式  懶漢式
    private static Singleton singleton;
    private Singleton(){}
    
    public static synchronized Singleton getSingleton(){
        if(singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getSingleton();
        Singleton instance2 = Singleton.getSingleton();
        System.out.println(instance1==instance2);
    }
}

2:享元模式

//享元模式是多個變數公用一個物件例項  大大節約了記憶體空間  提高了系統性能  String類是final型別 就是使用了享元模式
//資料庫連線池 執行緒池也是享元模式的應用
public abstract class Flyweight {
    // 享元模式 享元抽象類
    public abstract void operation();
}

//具體類 享元實現類
public class CreateFlyweight extends Flyweight {

    private String str;

    public CreateFlyweight(String str) {
        this.str = str;
    }

    @Override
    public void operation() {
        // TODO Auto-generated method stub
        System.out.println("Create---Flyweight:" + str);
    }

    public static void main(String[] args) {
        Flyweight flyweight = new CreateFlyweight("fanck");
        flyweight.operation();
    }

}

//工廠方法類 維護一個物件儲存池 享元工廠類
public class FlyweightFactory {
    private Hashtable flyweights = new Hashtable();

    public FlyweightFactory() {
    };

    public Flyweight getFlyweight(Object obj) {
        Flyweight flyweight = (Flyweight) flyweights.get(obj);
        if (flyweight == null) {
            flyweight = new CreateFlyweight((String) obj);
            flyweights.put(obj, flyweight);
        }
        return flyweight;
    }

    public int getFlyweightSize() {
        System.out.println("flyweights:"+flyweights);
        return flyweights.size();
    }

    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();
        Flyweight fly1 = flyweightFactory.getFlyweight("abc");
        Flyweight fly2 = flyweightFactory.getFlyweight("b");
        Flyweight fly3 = flyweightFactory.getFlyweight("abc");
        Flyweight fly4 = flyweightFactory.getFlyweight("ef");
        Flyweight fly5 = flyweightFactory.getFlyweight("ef");
        Flyweight fly6 = flyweightFactory.getFlyweight("ef");
        fly1.operation();
        fly2.operation();
        fly3.operation();
        fly4.operation();
        fly5.operation();
        fly6.operation();
        System.out.println(flyweightFactory.getFlyweightSize());
    }
}


相關推薦

模式模式區別

單例模式是類級別的,一個類只能有一個物件例項; 享元模式是物件級別的,可以有多個物件例項,多個變數引用同一個物件例項; 享元模式主要是為了節約記憶體空間,提高系統性能,而單例模式主要為了可以共享資料;

[設計模式] 多模式模式區別

多例模式與單例模式都禁止外界直接將之例項化,同時通過靜態工廠方法向外界提供迴圈使用的自身的例項。它們的不同在於單例模式僅有一個例項,而多例模式則可以有多個例項。 多例模式往往具有一個聚集屬性,通過向這個聚集屬性登記已經建立過的例項達到迴圈使用例項的目的。一般而言,一個典型的

對工廠模式模式的理解

正式學java也那麼久了,今天就來梳理一下java的工廠模式(據說這是java23例模式中最簡單的一種模式) 所謂的工廠模式大概就是通過一個介面實現對子類的呼叫,當初我接觸工廠模式的時候,還沒意識到原來這就是工廠模式, 當時老師是據了一個抽獎系統的例子,大概是這樣,先寫一個

php面向物件(工廠模式模式

今天剛學習了php的設計模式,一個是工廠模式而另一個是單例模式,工廠模式設計出來就是為了一種方便建立物件而做出來的。還有一個是單例模式,單例模式的設計有些比較難以理解,我們必須一步一步的分析:單例類的情況必須去建立類的例項,而且必須只有一個,首先沒有物件例項的情況就是將它的

模式模式區別

享元模式可以理解成一組共享的物件集合 享元模式 Class flyWeight { Object get(std::string key) { if(m_m

通過 python的 __call__ 函式類 實現模式

簡單一句話,當一個類實現__call__方法時,這個類的例項就會變成可呼叫物件。 直接上測試程式碼 class ClassA: def __call__(self, *args, **kwargs): print('call ClassA i

(Boolan)C++設計模式 <九> ——模式(Singleton)和模式(FlyWeight)

“物件效能”模式 面向物件很好的解決了“抽象”的問題,但是必不可免地要付出一定的代價。對於通常情況來講,面向物件的成本大都可以忽略不計。但是某些情況,面向物件所帶來的成本必須謹慎處理。 典型模式Sington Flyweight 單例模式Singleton 保證一個類僅有一個例項,並

【設計模式模式的理解場景舉例

數據 好處 ask 配置管理 關鍵詞 簡潔 多次 nag 序列 軟件設計常用的一種設計模式 —— 單例模式 體現:在應用這個模式時,單例對象的類必須保證只有一個實例存在。 好處:許多時候整個系統只需要擁有一個全局的對象,這樣有利於我們協調整個系統的行為。 場景舉例 1.服務

設計模式模式工廠模式的Python實現(一)

1. 單例模式 單例模式(Singleton Pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某一個類只有一個例項存在。當你希望在整個系統中,某個類只能出現一個例項時,單例物件就能派上用場。 比如,某個伺服器程式的配置資訊存放在一個檔案中,客戶端通過一個 AppConfig 的類來讀取配置檔案

設計模式模式五(序列化反序列化破壞)

單例模式的核心是要保證單例,但是在將一個例項序列化到一個檔案中後,再反序列化得到一個例項,這兩個例項是不同的,這就違反了單例原則,如下面惡漢式單例模式對序列化的測試: 由上面的列印資訊可知得到的是兩個不同的例項,通過除錯跟程式碼可以很容易發現,在反序列化時通過反

Java中基於靜態變數模式對快取的簡單實現

●What & Why 快取是什麼?他有什麼好處?相信不用說大家都知道。 目前筆者在做一個Java開發的Web專案,專案啟動的時候需要將大量不變的平臺數據放入快取中,方便快速讀取。一開始筆者很疑惑,Java是不能直接操作記憶體的,但是我們快取卻是要把資料放入記憶體

設計模式的分類 模式

設計模式GOF23(Group of four 四人幫) 一、設計模式是面向物件思想中重要的一點。 二、模式分為分為三種: 1.建立型模式:幫助我們建立物件 (1)單例模式 (2)工廠模式 (3)抽象工廠模式 (4)建造者模式 (5)原型模式 2.結構型模式:

設計模式XML(二)建造者模式模式(C++)

一、實驗目的及要求 1、掌握建立型模式的概念。 2、掌握工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式的構造方式及使用情景。 二、實驗裝置(環境) 1、   軟體需求: Dev-Cpp5.4, Rational Rose / Microsoft Visio

設計模式模式執行緒安全問題

前言 單例模式分為“餓漢模式”與“懶漢模式”。今天我們來聊聊單例模式,特別是在多執行緒中我們需要特別注意。 餓漢模式 class Singleton{ private static Singleton singleton = new Singleton(); private Singl

關鍵字static模式的一點理解

static是java語言中的一個關鍵字,表示一個靜態修飾符,修飾符比較容易理解,靜態修飾符又有什麼特點呢,首先程式中的任何變數或者程式碼都是在編譯時,由系統自動分配記憶體來儲存的,而靜態的特點就是指,在編譯後所分配的記憶體會一直存在,直到程式退出是才會釋放這個

設計模式模式工廠模式

單例模式 概念 單例模式是一種常見的“設計模式”! 什麼是設計模式? 所謂的設計模式,並不是一種新的語法,而是人們在實際的應用中面對某種特定的情形而設計出來的某種常見的有效的解決方案,只是經驗的總結! 單例就是單一的例項! 如果我們能通過某些技巧從語法上使得一個類只能開闢一

Python基礎——類new方法模式

介紹:     new方法是類中魔術方法之一,他的作用是給類例項化開闢一個記憶體地址,並返回一個例項化,再由__init__對這個例項進行初始化,故它的執行肯定就是在初始化方法__init__之前了。new方法的第一個引數cls是類本身的含義(即你要例項化的類),與self

[Unity]建構函式模式

從BUG說起 在實現一個小功能時,遇到了一個bug,程式碼如下: public class EnemySpawner : MonoBehaviour { #region singleton private EnemySpawner()

同步原語 volatile 簡介模式

Volatile 簡介 volatile 的作用 在多執行緒併發程式設計中 synchronized 和 volatile 都扮演著重要的角色,volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變數的“可見性”。共享變數

Java模式

最近在閱讀《Effective Java 》這本書,第3個條款專門提到了單例屬性,並給出了使用單例的最佳實踐建議。讓我對這個單例模式(原本我以為是設計模式中最簡單的一種)有了更深的認識。 單例模式 單例模式(Singleton Pattern)是