1. 程式人生 > >C#--設計模式之享元模式

C#--設計模式之享元模式

這幾天專案比較忙,感覺已經隔了半個世紀沒來園裡轉了,接著上次的設計模式來繼續說吧,這會來敘說一下享元模式,首先應用場景:就是在  我們需要重複使用某個物件的時候,如果我們重複地使用new建立這個物件的話,這樣我們在記憶體就需要多次地去申請記憶體空間了,這樣可能會出現記憶體使用越來越多的情況,這樣的問題是非常嚴重,然而享元模式可以解決這個問題,具體定義:運用共享技術有效地支援大量細粒度的物件。享元模式可以避免大量相似類的開銷,在軟體開發中如果需要生成大量細粒度的類例項來表示資料,如果這些例項除了幾個引數外基本上都是相同的,這時候就可以使用享元模式來大幅度減少需要例項化類的數量。如果能把這些引數(指的這些類例項不同的引數)移動類例項外面,在方法呼叫時將他們傳遞進來,這樣就可以通過共享大幅度地減少單個例項的數目。(這個也是享元模式的實現要領),然而我們把類例項外面的引數稱為享元物件的外部狀態,把在享元物件內部定義稱為內部狀態。具體享元物件的內部狀態與外部狀態的定義為:

內部狀態:在享元物件的內部並且不會隨著環境的改變而改變的共享部分

外部狀態:隨環境改變而改變的,不可以共享的狀態。

上熱菜:

      // 定義外部狀態,例如字母的位置等資訊
            int externalstate = 10;
            // 初始化享元工廠
            FlyweightFactory factory = new FlyweightFactory();

            // 判斷是否已經建立了字母A,如果已經建立就直接使用建立的物件A
            Flyweight fa = factory.GetFlyweight("A");
            if (fa != null)
            {
                // 把外部狀態作為享元物件的方法呼叫引數
                fa.Operation(--externalstate);
            }
            // 判斷是否已經建立了字母B
            Flyweight fb = factory.GetFlyweight("B");
            if (fb != null)
            {
                fb.Operation(--externalstate);
            }
            // 判斷是否已經建立了字母C
            Flyweight fc = factory.GetFlyweight("C");
            if (fc != null)
            {
                fc.Operation(--externalstate);
            }
            // 判斷是否已經建立了字母D
            Flyweight fd = factory.GetFlyweight("D");
            if (fd != null)
            {
                fd.Operation(--externalstate);
            }
            else
            {                   
                Console.WriteLine("駐留池中不存在字串D");
                // 這時候就需要建立一個物件並放入駐留池中
                ConcreteFlyweight d = new ConcreteFlyweight("D");
                factory.flyweights.Add("D", d);
            }
            Console.Read();


        }


   
        /// <summary>
        /// 享元工廠,負責建立和管理享元物件
        /// </summary>
        public class FlyweightFactory
        {
            // 最好使用泛型Dictionary<string,Flyweighy>
            //public Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>();
            public Hashtable flyweights = new Hashtable();

            public FlyweightFactory()
            {
                flyweights.Add("A", new ConcreteFlyweight("A"));
                flyweights.Add("B", new ConcreteFlyweight("B"));
                flyweights.Add("C", new ConcreteFlyweight("C"));
            }

            public Flyweight GetFlyweight(string key)
            {
                // 更好的實現如下
                //Flyweight flyweight = flyweights[key] as Flyweight;
                //if (flyweight == null)
                //{
                //    Console.WriteLine("駐留池中不存在字串" + key);
                //    flyweight = new ConcreteFlyweight(key);
                //}
                //return flyweight;
                return flyweights[key] as Flyweight;
            }
        }

        /// <summary>
        ///  抽象享元類,提供具體享元類具有的方法
        /// </summary>
        public abstract class Flyweight
        {
            public abstract void Operation(int extrinsicstate);
        }

        // 具體的享元物件,這樣我們不把每個字母設計成一個單獨的類了,而是作為把共享的字母作為享元物件的內部狀態
        public class ConcreteFlyweight : Flyweight
        {
            // 內部狀態
            private string intrinsicstate;

            // 建構函式
            public ConcreteFlyweight(string innerState)
            {
                this.intrinsicstate = innerState;
            }

            /// <summary>
            /// 享元類的例項方法
            /// </summary>
            /// <param name="extrinsicstate">外部狀態</param>
            public override void Operation(int extrinsicstate)
            {
                Console.WriteLine("具體實現類: intrinsicstate {0}, extrinsicstate {1}", intrinsicstate, extrinsicstate);
            }
        }

執行結果如下:

相關推薦

設計模式模式C++)

設計模式之享元模式 享元模式,運用共享技術有效地支援大量細粒度的物件。面向物件技術可以很好地解決一些靈活性或擴充套件性問題,但在很多情況下需要在系統中增加類和物件的個數。當物件數量太多時,將導致執行代價過高,帶來效能下降等問題。享元模式正式為了解決這依賴問題而誕

C#--設計模式模式

這幾天專案比較忙,感覺已經隔了半個世紀沒來園裡轉了,接著上次的設計模式來繼續說吧,這會來敘說一下享元模式,首先應用場景:就是在  我們需要重複使用某個物件的時候,如果我們重複地使用new建立這個物件的話,這樣我們在記憶體就需要多次地去申請記憶體空間了,這樣可能會出現記憶

23種設計模式模式(結構型,7 Flyweight,c++實現)

程式碼實現:#include<iostream>#include<list>#include<string>#include<map>usingnamespace std;classPerson{public:Person(st

c#設計模式模式

//類似單例模式加上工廠模式,避免大量建立物件帶來的記憶體消耗 using System; using System.Collections; public abstract class cha

java設計模式模式

並不是 計算 lov 這一 返回 實例 map() 角色 ron 當前咱們國家正在大力倡導構建和諧社會,其中一個很重要的組成部分就是建設資源節約型社會,“浪費可恥,節儉光榮”。在軟件系統中,有時候也會存在資源浪費的情況,例如在計算機內存中存儲了多個完全相同或者非常相似的

Head First設計模式模式(蠅量模式

logs sign face isp ria reat 定義 ogr sans 一、定義 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的

Java設計模式模式實例詳解

AI ava flyweight lan trac home erro lin 代碼 本文實例講述了Java設計模式之享元模式。分享給大家供大家參考,具體如下: 解釋一下概念:也就是說在一個系統中如果有多個相同的對象,那麽只共享一份就可以了,不必每個都去實例化一個對象。比如

設計模式---對象性能模式模式(Flyweight)

ret 大量 根據 利用 問題 字母 只讀 時代 帶來 一:概念 通過與其他類似對象共享數據來減少內存占用 如果一個應用程序使用了太多的對象, 就會造成很大的存儲開銷。 特別是對於大量輕量級 (細粒度)的對象,比如在文檔編輯器的設計過程中,我們如果為每個字母

設計模式的藝術 結構性模式模式

前言 知道圍棋的都知道圍棋有兩種顏色的棋子,黑色和白色,不同的地方就在於他們所放置的位置不同,大體是一樣的,所以廠家生產的時候也就是批量的進行生產,反正棋子放哪他們並不需要操心,在計算機中也會存在著很多相似的物件,如果相同的物件太多將導致系統執行代價過高,記憶體屬於計算機稀缺資源,不能隨便浪費,

設計模式模式(蠅量模式

設計模式之享元模式(蠅量模式) 1. 什麼是享元模式 Flyweight模式也叫享元模式,是構造型模式之一,它通過與其他類似物件共享資料來減小記憶體佔用。 換句話說就是通過共享的方式高效地支援大量細粒度的物件。 享元模式的結構: 享元模式的角色和職責:

設計模式模式(Flyweight)

設計模式之享元模式(Flyweight) 本篇為https://github.com/iluwatar/java-design-patterns/tree/master/flyweight閱讀筆記 場景 煉金術士的商店裡擺滿了魔法藥水。許多藥水是相同的,因此不需要為每

設計模式 模式

info 如果能 實例化 應用 技術 一個 對象存儲 數量 col (一) 享元模式   享元模式 : 運用共享技術有效地支持大量細粒度的對象    (二)內部狀態和外部狀態   在享元對象內部並且不會隨環境改變而改變的共享部分,可以稱為是享元對象的內部狀態,而隨環

設計模式模式(Flyweight Pattern)

目的:主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。 應用例項: 1、JAVA 中的 String,如果有則返回,如果沒有則建立一個字串儲存在字串快取池裡面。 2、資料庫的資料池。 程式碼: 畫圖形的 介面,描述畫這個動作: public interface Shape {

設計模式模式

享元模式定義 享元模式(Flyweight Pattern)是池技術的重要實現方式,使用共享物件可有效地支援大量的細粒度的物件。 通用類圖 具體實現 當應用程式中存在大量的物件時,程式的效能會有所下降,而且可能會造成記憶體溢位。這時除了增加硬體資源或者借用

每天一個設計模式模式

作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 個人技術部落格-godbmw.com 歡迎來玩! 每週至少 1 篇原創技術分享,還有開源教程(webpack

23種設計模式模式

享元模式的定義 定義: 使用共享物件可有效的支援大量的細粒度的物件 通俗的說, 就是將類的通用屬性抽出來,建立物件池,以達到限制物件數量的效果 上面定義中要求細粒度物件, 那麼不可避免的使得物件數量多且性質相近, 我們將這些物件的資訊分為兩個部分: 內部狀態和外部狀態 內部狀態是物件可以共享出來

設計模式模式(結構型)

程序 aid 共享 對象 ron map 內部 系統 抽象 模式定義 享元模式(Flyweight Pattern)就是通過共享技術實現大量細粒度對象的復用。享元模式是通過細粒度對象的共享,所以也可以說享元模式是一種輕量級模式。按照Gof模式分類,享元模式屬於對象結構型模式

設計模式模式(卷十一)

通過使用池的技術,有效減少了大量細粒度的物件的重複生成。 0x00 組織結構 Flyweight:抽象享元類,聲明瞭可以想外界提供內部狀態的方法,同時還可以設定外部狀態。 ConcreteFlyweight:具體享元類,通常和單例模式組合使用。 U

設計模式模式(2)

本質 分離與共享。 程式碼示例 (1)定義描述授權資料的享元介面 package flyWeight; public interface FlyWeight { public b

java設計模式模式Flyweight

package com.javapatterns.flyweight.simple; public class Client { private static FlyweightFactory factory; static public void main(String[] args) { fact