設計模式之:享元模式FlyweightPattern的實現

来源:https://www.cnblogs.com/zhangdezhang/archive/2022/04/03/16096206.html
-Advertisement-
Play Games

享元模式的理解: 享元模式的定義:運用共用技術支持大量細粒度對象的復用; Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently. 享元模式關鍵詞:大量、細粒度、復用、 ...


享元模式的理解:

享元模式的定義:運用共用技術支持大量細粒度對象的復用;

Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently.

享元模式關鍵詞:大量、細粒度、復用、享元池、享元工廠

  1. 當系統中存在大量的細粒度的相同或相似對象時,可以使用享元模式;
  2. 享元模式通過共用技術,實現相同或相似對象的重覆利用;
  3. 享元的字面理解:也就是分享共用的意思,就是共用的元素、對象;
  4. Flyweight的字面理解:Flyweight本意是拳擊運動的一個術語,就是蠅量級的意思,flyweight 蠅量級 112磅;
  5. 享元模式也叫輕量級模式,享元是對Flyweight的意譯,直譯的話應該叫蠅量級模式;
  6. 英文定義中採用Flyweight,是想表達對象的粒度,也就是fine-grained細粒度的意思;
  7. grain本意表示穀物,grained表示像穀物那種顆粒狀態,即粒度,而fine-grained則表示細粒度,例如fine grained soil 細土、coarse grained soil粗粒土;
  8. 享元模式和Unity中的預製體作用類似,享元模式可以通過共用元素生成多個對象,Unity同樣可以通過Prefabs生成成千上萬的怪物;
  9. 還有諸如對象池、線程池,實際上也是享元模式的使用案例;

類圖with StarUML

棋子抽象類和2個實現類

    internal abstract class Chessman
    {
        public abstract string GetColor();
        public void Display() { Console.WriteLine($"棋子顏色{this.GetColor()}"); }
    }
    internal class BlackChessman : Chessman
    {
        public override string GetColor() { return "黑色"; }
    }
    internal class WhiteChessman : Chessman
    {
        public override string GetColor() { return "白色"; }
    }

享元工廠類

    internal class ChessmanFactory
    {
        //餓漢式單例模式
        private static ChessmanFactory instance = new ChessmanFactory();
        //該字典相當於享元池(對象池)Flyweight Pool
        private Dictionary<string, Chessman> dictionary;
        //構造註入依賴項Chessman/BlackChessman/WhiteChessman
        private ChessmanFactory()
        {
            dictionary = new Dictionary<string, Chessman>();
            Chessman black = new BlackChessman();
            Chessman white = new WhiteChessman();
            dictionary.Add("b", black);
            dictionary.Add("w", white);
        }
        //返回唯一實例
        public static ChessmanFactory GetInstance() { return instance; }
        //根據鍵是b還是w,返回字典中的對應棋子
        public Chessman GetChessman(string color) { return dictionary[color]; }
    }

客戶端

    internal class Program
    {
        static void Main(string[] args)
        {
            Chessman black1, black2, white1, white2;
            ChessmanFactory factory = ChessmanFactory.GetInstance();
            //生成兩顆黑子,並比較
            black1 = factory.GetChessman("b");
            black2 = factory.GetChessman("b");
            Console.WriteLine($"兩顆黑子是否相同?{black1 == black2}");
            //生成兩顆白字,並比較
            white1 = factory.GetChessman("w");
            white2 = factory.GetChessman("w");
            Console.WriteLine($"兩顆白子是否相同?{black1 == black2}");
            //顯示棋子
            black1.Display();
            black2.Display();
            white1.Display();
            white2.Display();

            Console.Read();
        }
    }

 

運行結果

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Dimension 基於 .NET 6 的線上音視頻聊天項目 WPF和ASP.NET API開發 使用第三方依賴介紹 公用依賴 log4net 日誌記錄。 SignalR 用於伺服器與客戶端的通訊手段,該項目用於好友申請、消息提示、公告、聊天和音視頻通話等一系列通知。 EntityFramework ...
  • 將Excel轉為PDF格式時,通常情況下轉換出來的PDF頁面都是預設的寬度大小;如果Excel表格數據的設計或佈局比較寬或者數據內較少的情況,轉出來的PDF要麼會將原本的一個表格分割顯示在兩個頁面,或者一頁頁面上內容很少,影響讀者對數據完整性的閱讀以及文檔美觀性的設計。為避免這種情況的出現,可以在實 ...
  • 在介紹網路模式之前,關於網路的幾個簡單命令的使用 ifup eth0 //啟動網卡eth0 ifdown eth0 //關閉網卡eth0 /etc/network/interfaces //網路配置文件 /etc/init.d/networking //網路服務位置 /etc/init.d/netw ...
  • 背景:項目中,需要給幾百張表添加相同的欄位,手動添加比較費勁,於是打算使用存儲過程實現。 編寫的存儲過程: delimiter // -- 創建存儲過程之前需判斷該存儲過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS updateTables; -- 創建存儲過程 CR ...
  • 一、mysql事務 資料庫中的事務是指對資料庫執行一批操作,在同一個事務當中,這些操作最終要麼全部執行成功,要麼全部失敗,不會存在部分成功的情況。MySQL 事務主要用於處理操作量大,複雜度高的數據。 事物的幾個特征:原子性、一致性、隔離性、持久性。 (1).原子性:一個事務(transaction ...
  • 經過前面五天的學習,對Node.js開發已經逐漸入門,今天結合之前學到的東西,開發一個小示例【爬取某圖片網站的圖片】來鞏固基礎知識,僅供學習分享使用,如有不足之處,還請指正。 ...
  • Vue3 diff演算法圖解分析 大家好,我是劍大瑞,本篇文章主要分析Vue3 diff演算法,通過本文你可以知道: diff的主要過程,核心邏輯 diff是如何進行節點復用、移動、卸載 並有一個示例題,可以結合本文進行練習分析 如果你還不是特別瞭解Vnode、渲染器的patch流程,建議先閱讀下麵兩篇 ...
  • 享元模式是什麼 享元模式:是一種結構型設計模式,它允許你在消耗少量的記憶體的情況下支持大量的對象。享元模式通過共用多個對象的部分狀態來實現上述功能。即是享元模式會將不同對象的相同功能緩存以節省記憶體。 為什麼用享元模式 如果程式中有很多相似對象,這時候你就可以用享元模式來節約記憶體。 享元模式怎麼實現 這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...