1. 程式人生 > 其它 >設計模式(13)----- 享元模式

設計模式(13)----- 享元模式

技術標籤:設計模式(Design pattern)設計模式c#

概念:

享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。

主要解決:

在有大量物件時,有可能會造成記憶體溢位,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在記憶體中已有的物件,避免重新建立。

優點

相同物件只要儲存一份,這降低了系統中物件的數量,從而降低了系統中細粒度物件給記憶體帶來的壓力。

缺點

為了使物件可以共享,需要將一些不能共享的狀態外部化,這將增加程式的複雜性。

讀取享元模式的外部狀態會使得執行時間稍微變長。

模式的結構

享元模式的主要角色有如下。

抽象享元角色(Flyweight):是所有的具體享元類的基類,為具體享元規範需要實現的公共介面,非享元的外部狀態以引數的形式通過方法傳入。

具體享元(Concrete Flyweight)角色:實現抽象享元角色中所規定的介面。

非享元(Unsharable Flyweight)角色:是不可以共享的外部狀態,它以引數的形式注入具體享元的相關方法中。

享元工廠(Flyweight Factory)角色:負責建立和管理享元角色。當客戶物件請求一個享元物件時,享元工廠檢査系統中是否存在符合要求的享元物件,如果存在則提供給客戶;如果不存在的話,則建立一個新的享元物件。

例:

角色類

using System;

public class 中國坦克
{
    public void GetCountry()
    {
        Console.WriteLine("我是中國坦克");
    }
}

享員工廠

using System;
using System.Collections.Generic;
public class 中國工廠 
{
    private Dictionary<string,中國坦克> tanks = new Dictionary<string, 中國坦克>();
    public
Dictionary<string, 中國坦克> 建立坦克(string a) { if (!tanks.ContainsKey(a)) { tanks.Add(a, new 中國坦克()); Console.WriteLine("新增到坦克列表中" + a); } else { Console.WriteLine("坦克列表中已存在" + a); } return tanks; } }

測試

using System;

class Program
{
    static void Main(string[] args)
    {
        中國工廠 m = new 中國工廠();
        m.建立坦克("a");
        m.建立坦克("b");
        m.建立坦克("c");
        m.建立坦克("b");
        m.建立坦克("c");
        m.建立坦克("a");
        Console.Read();
    }
}

測試
在這裡插入圖片描述
享元模式的應用場景

當系統中多處需要同一組資訊時,可以把這些資訊封裝到一個物件中,然後對該物件進行快取,這樣,一個物件就可以提供給多出需要使用的地方,避免大量同一物件的多次建立,降低大量記憶體空間的消耗。

享元模式其實是工廠方法模式的一個改進機制,享元模式同樣要求建立一個或一組物件,並且就是通過工廠方法模式生成物件的,只不過享元模式為工廠方法模式增加了快取這一功能。