日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

详解设计模式:享元模式

發布時間:2023/12/20 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解设计模式:享元模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

享元模式(Flyweight Pattern),是對象池的一種體現,也是 GoF 的 23 種設計模式中的一種結構型設計模式。

享元模式 主要用于減少創建對象的數量,以減少內存占用和提高性能。它提供了減少對象數量從而改善應用所需的對象結構的方式。

享元模式 嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。

~

本篇內容包括:關于享元模式、享元模式 Demo


文章目錄

    • 一、關于享元模式
        • 1、關于享元模式
        • 2、關于享元模式的構成
        • 3、關于享元模式的XML
        • 4、關于享元模式的應用場景
        • 5、關于享元模式在 Java 中的應用
        • 6、關于享元模式的優缺點
    • 二、享元模式 Demo
        • 1、Demo 設計
        • 2、Demo 實現


一、關于享元模式

1、關于享元模式

享元模式(Flyweight Pattern),是對象池的一種體現,也是 GoF 的 23 種設計模式中的一種結構型設計模式。

享元模式 主要用于減少創建對象的數量,以減少內存占用和提高性能。它提供了減少對象數量從而改善應用所需的對象結構的方式。

享元模式 嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。

2、關于享元模式的構成

享元模式主要包含四種角色:

  • 抽象享元(Flyweight)角色:是所有的具體享元類的基類,為具體享元規范需要實現的公共接口,非享元的外部狀態以參數的形式通過方法傳入。
  • 具體享元(Concrete Flyweight)角色:實現抽象享元角色中所規定的接口。
  • 非享元(Unsharable Flyweight)角色:是不可以共享的外部狀態,它以參數的形式注入具體享元的相關方法中。
  • 享元工廠(Flyweight Factory)角色:負責創建和管理享元角色。當客戶對象請求一個享元對象時,享元工廠檢査系統中是否存在符合要求的享元對象,如果存在則提供給客戶;如果不存在的話,則創建一個新的享元對象。
  • 3、關于享元模式的XML

    4、關于享元模式的應用場景

    當系統中多處需要同一組信息時,可以吧這些信息封裝到一個對象中,然后對該對象進行緩存,這樣,一個對象就可以提供給多處需要使用的地方,避免大量同一對象多次創建,消耗大量內存空間。
    享元模式其實就是工廠模式的一個改進機制,享元模式同樣要求創建一個或一組對象,并且就是通過工廠方法生成對象的,只不過享元模式中為工廠方法增加了緩存這一功能。主要總結為以下應用場景:

  • 常常應用于系統底層的開發,以便解決系統的性能問題。
  • 系統有大量相似的對象、需要緩存池的場景。
  • 在生活中的享元模式也很常見,比如中介機構的房源共享,再比如全國社保聯網。

    5、關于享元模式在 Java 中的應用

    在 Java 中最直觀的享元模式就是在 Boolean,Byte,Integer,Long,Character 這些包裝類中,他們都提供了valueOf()方法。

    比如:Long 的 valueOf() 方法會緩存數值 -127~128 之間的 Long 對象,在這個范圍之間就會直接在這個里面去取,大于這個范圍才會去 new Long 對象

    public static Long valueOf(long l) {final int offset = 128;if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset];}return new Long(l);}private static class LongCache {private LongCache(){}static final Long cache[] = new Long[-(-128) + 127 + 1];static {for(int i = 0; i < cache.length; i++)cache[i] = new Long(i - 128);}}

    Byte,Short,Long 的范圍是 -127~128 之間。

    Character 是 0~127 之間。

    Integer 是 -127~128 之間,最小值不能改變,但是最大值可以通過虛擬機參數進行改變。-Djava.long.Intger.IntegerCache.high 來改變

    Boolean 緩存了 TRUE 和 FALSE

    6、關于享元模式的優缺點

    # 享元模式的優點:

  • 減少對象的創建,降低內存中對象的數量,降低系統的內存,提高效率;
  • 減少內存之外的其它資源占用。
  • # 享元模式的缺點:

  • 關注內、外部狀態、關注線程安全問題;
  • 使系統、程序復雜化。

  • 二、享元模式 Demo

    1、Demo 設計

    俄羅斯方塊有不同的形狀,我們可以對這些形狀向上抽取出 AbstractBox,用來定義共性的屬性和行為。

    接下來就是定義不同的形狀了,IBox類、LBox類、TBox類等。

    提供了一個工廠類(BoxFactory),用來管理享元對象(也就是 AbstractBox 子類對象),該工廠類對象只需要一個,所以可以使用單例模式。并給工廠類提供一個獲取形狀的方法。

    2、Demo 實現

    # AbstractBox 抽象享元角色

    public abstract class AbstractBox {public abstract String getShape();public void display(String color) {System.out.println("方塊形狀:" + this.getShape() + " 顏色:" + color);} }

    # IBox/LBox/TBox 具體享元角色

    public class IBox extends AbstractBox {@Overridepublic String getShape() {return "I";} }public class LBox extends AbstractBox {@Overridepublic String getShape() {return "L";} }public class TBox extends AbstractBox {@Overridepublic String getShape() {return "T";} }

    # BoxFactory 享元工廠

    public class BoxFactory {private static HashMap<String, AbstractBox> map;private BoxFactory() {map = new HashMap<String, AbstractBox>();AbstractBox iBox = new IBox();AbstractBox lBox = new LBox();AbstractBox oBox = new OBox();map.put("I", iBox);map.put("L", lBox);map.put("O", oBox);}public static final BoxFactory getInstance() {return SingletonHolder.INSTANCE;}private static class SingletonHolder {private static final BoxFactory INSTANCE = new BoxFactory();}public AbstractBox getBox(String key) {return map.get(key);} }

    總結

    以上是生活随笔為你收集整理的详解设计模式:享元模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。