設計模式(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();
}
}
測試
享元模式的應用場景
當系統中多處需要同一組資訊時,可以把這些資訊封裝到一個物件中,然後對該物件進行快取,這樣,一個物件就可以提供給多出需要使用的地方,避免大量同一物件的多次建立,降低大量記憶體空間的消耗。
享元模式其實是工廠方法模式的一個改進機制,享元模式同樣要求建立一個或一組物件,並且就是通過工廠方法模式生成物件的,只不過享元模式為工廠方法模式增加了快取這一功能。