設計模式 創建型 單例模式 原型模式 享元模式

一、創建型 單例模式 原型模式 享元模式

  1. 單例模式

  2. 原型模式

    1. 原型模式是通過給出一個原型對象來指明所創建的對象的類型,然後使用自身實現的克隆接口來複制這個原型對象,該模式就是用這種方式來創建出更多同類型的對象。
    2. 使用這種方式創建新的對象的話,就無需再通過 new 實例化來創建對象了。這是因爲 Object 類的 clone 方法是一個本地方法,它可以直接操作內存中的二進制流,所以性能相對 new 實例化來說,更佳。
    3. 通過 clone 方法複製的對象纔是真正的對象複製,clone 方法賦值的對象完全是一個獨立的對象。 注意深拷貝和淺拷貝
    4. 一些重複創建對象的場景下,我們就可以使用原型模式來提高對象的創建性能。例如, 循環體內創建對象時,我們就可以考慮用 clone 的方式來實現。
    5. 在不得已需要重複創建大量同一對象時,我們可以使用原型模式,通過 clone 方法複製對象,這種方式比用 new 和序列化創建對象的效率要高;
  3. 享元模式

    1. 享元模式是運用共享技術有效地最大限度地複用細粒度對象的一種模式。該模式中,以對象的信息狀態劃分,可以分爲內部數據和外部數據。內部數據是對象可以共享出來的信息,這些信息不會隨着系統的運行而改變;外部數據則是在不同運行時被標記了不同的值。
    2. 享元模式一般可以分爲三個角色,分別爲 Flyweight(抽象享元類)、ConcreteFlyweight(具體享元類)和 FlyweightFactory(享元工廠類)。抽象享元類通常是一個接口或抽象類,向外界提供享元對象的內部數據或外部數據;具體享元類是指具體實現內部數據共享的類;享元工廠類則是主要用於創建和管理享元對象的工廠類。
    3. 例如 Java 的 String 字符串,在一些字符串常量中,會共享常量池中字符串對象,從而減少重複創建相同值對象,佔用內存空間。
     String s1 = "hello";
     String s2 = "hello";
     System.out.println(s1==s2);//true
    
    
    1. 線程池就是享元模式的一種實現
    2. 將商品存儲在應用服務的緩存中,那麼每當用戶獲取商品信息時,則不需要每次都從 redis 緩存或者數據庫中獲取商品信息,並在內存中重複創建商品信息了。
    3. 在創建對象時,如果我們可以共用對象的內部數據,那麼通過享元模式共享相同的內部數據的對象,就可以減少對象的創建,實現系統調優。

二、區別

  1. 單例模式是針對某個類的單例,享元模式可以針對一個類的不同表現形式的單例,享元模式是單例模式的超集。
  2. 享元模式可以再次創建對象 也可以取緩存對象,單例模式則是嚴格控制單個進程中只有一個實例對象,享元模式可以通過自己實現對外部的單例 也可以在需要的使用創建更多的對象
  3. .

三、new一個對象和clone一個對象

  1. 一個對象通過new創建的過程爲:
    1、在內存中開闢一塊空間;
    2、在開闢的內存空間中創建對象;
    3、調用對象的構造函數進行初始化對象。

  2. 而一個對象通過clone創建的過程爲:
    1、根據原對象內存大小開闢一塊內存空間;
    2、複製已有對象,克隆對象中所有屬性值。

  3. 相對new來說,clone少了調用構造函數。如果構造函數中存在大量屬性初始化或大對象,則使用clone的複製對象的方式性能會好一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章