【設計模式】享元模式 - 共享物件

定義


享元模式(英語:Flyweight Pattern)是一種軟體設計模式。它使用共享物件,用來儘可能減少記憶體使用量以及分享資訊給儘可能多的相似物件. 取自 wiki

享元模式是以提高性能為目的的設計模式,核心思想是:如果存在著多個可以重複使用的對象,那麼就只需要共享同一份就好,不需要每次都去創建新的對象。

用Unity的來比喻的話,就像是使用靜態變數Verctor2.one跟new Vector2(1,1)的感覺,而享元模式則是在一個 【享元工廠類】 中創建而且管理所需要共享的對象。

簡化應用


這邊講簡化是因為,跟一般別人介紹的不太一樣,但個人覺得只要有享元模式的概念就好,所以就簡化來使用

WeaponBaseAttr :需要共享的對象

WeaponAttrFactory:在工廠內獲得想要的數據

Client :用戶端去使用Factory

1
2
3
4
5
6
7
8
9
10
11
12
13
public class WeaponBaseAttr 
{
protected int mBulletCount;
protected float mBulletSpeed;
protected float mCdTime;

public WeaponBaseAttr(int bulletCount, float bulletSpeed, float cdTime)
{
mBulletCount = bulletCount;
mBulletSpeed = bulletSpeed;
mCdTime = cdTime;
}
}

這邊在工廠內也可以不要在工廠類初始化weapon的資料,也可以繼承WeaponBaseAttr,實作每個資料的內容,但我就是這樣用了XD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class WeaponAttrFactory
{

private Dictionary<string, WeaponBaseAttr> mWeaponBaseAttrDictionary;

public WeaponAttrFactory()
{
InitBaseAttr();
}

private void InitBaseAttr()
{
mWeaponBaseAttrDictionary = new Dictionary<string, WeaponBaseAttr>
{
{ "散彈槍", new WeaponBaseAttr(8, 10f, 3f) },
{ "狙擊槍", new WeaponBaseAttr(5, 20f, 7f) },
{ "AK47", new WeaponBaseAttr(50, 10f, 0.5f) }
};

}

public WeaponBaseAttr GetWeaponBaseAttr(string name)
{
if (mWeaponBaseAttrDictionary.ContainsKey(name))
{
return mWeaponBaseAttrDictionary[name];
}
else return null;
}
}

然後就可以在Client端那邊,使用工廠的GetWeaponBaseAttr方法來獲取資料了,如果工廠模式用成靜態或單例會更方便一些

1
2
3
4
5
6
7
8
9
public class Client : MonoBehaviour
{
private void Start()
{
WeaponAttrFactory weaponAttrFactory = new WeaponAttrFactory();
WeaponBaseAttr shotGunAttr = weaponAttrFactory.GetWeaponBaseAttr("散彈槍");
WeaponBaseAttr ak47Attr = weaponAttrFactory.GetWeaponBaseAttr("AK47");
}
}