**定義:**享元模式(Flyweight Pattern),運用共享技術有效地支持大量細粒度的對象。
類型:結構型模式。
適用情況:
1. 一個應用程序有大量的對象。
1. 對象的大多數狀態都是外部的。
1. 如果刪除對象的外部狀態,可以和相對較少的共享對象取代很多組對象。
1. 應用程序不依賴對象的標識,即應用程序依賴于對象的抽象接口。
**概述:**
?????? Flyweight,原意為“輕量級選手”的意思。翻譯者將它意為享元模式,是意譯,力求能夠直觀地表現出此模式的目的。享,共享之意。元,基本單元的意思。享元,也就是共享基本單元,也即GoF所言的運用共享技術有效地支持大量細粒度的對象。
???????享元模式的重點在于將對象的“內部狀態”和“外部狀態”抽象出來,內部狀態存儲在享元對象中,而外部狀態在外部存儲。這個才是享元模式的關鍵,網上很多文章根本沒有講透這一點。
????????下面舉一個示例。有一棋盤上的圍棋正好是大量細粒度的對象。我們將材質、形狀、制作工藝抽象為內部狀態,?而圍棋在棋盤上的位置是標識每一棋子的標記,故棋子的位置抽象為外部狀態。而棋子只有白黑兩種顏色,如果存儲在外部狀態里,會存兩種顏色很多次。故這里,白棋、黑棋作為兩個對象存在。
類圖**:**

參與者:
1. Client,調用ChessBoard得到具體的棋子對象。
1. Chessboard,管理棋子的生成以及存儲棋子的外部狀態,即每個棋子的具體位置。
1. Weiqi,圍棋抽象類,即享元對象,抽象出一些內部狀態來。
1. WhiteWeiqi、BlackWeiqi,兩個派生出的不同顏色的圍棋,實現顏色接口。
示例代碼:
// Flyweight類
~~~
public abstract class Weiqi
{
// 內部狀態
// ...............
// private int nSize;
public abstract Color GetColor();
}
~~~
// 具體的Flyweight類
~~~
public class WhiteWeiqi : Weiqi {
public override Color GetColor()
{
Console.WriteLine("White");
return Color.White;
}
}
public class BlackWeiqi : Weiqi
{
public override Color GetColor()
{
Console.WriteLine("Black");
return Color.Black;
}
}
~~~
// FlyweightFactory類
~~~
public class Blessboard {
private List<Point> listWhite = new List<Point>();
private List<Point> listBlack = new List<Point>();
private WhiteWeiqi wWeiqi;
private BlackWeiqi bWeiqi;
public Blessboard()
{
wWeiqi = new WhiteWeiqi();
bWeiqi = new BlackWeiqi();
}
public Weiqi Produce(bool bWthite, Point pt)
{
if (bWthite)
{
listWhite.Add(pt);
return bWeiqi;
}
else
{
listBlack.Add(pt);
return bWeiqi;
}
}
public Weiqi GetProduce(Point pt)
{
foreach (Point p in listWhite)
{
if (p.Equals(pt))
{
return wWeiqi;
}
}
foreach (Point p in listBlack)
{
if (p.Equals(pt))
{
return bWeiqi;
}
}
return null;
}
}
~~~
// Client類
~~~
class Program {
static void Main(string[] args)
{
Blessboard bloard = new Blessboard();
// 生成棋子
bloard.Produce(true, new Point(1, 3));
bloard.Produce(false, new Point(2, 3));
bloard.Produce(true, new Point(1, 4));
bloard.Produce(false, new Point(2, 4));
// 查詢棋子黑白
Weiqi weiqi = bloard.GetProduce(new Point(2, 4));
Color color = weiqi.GetColor();
weiqi = bloard.GetProduce(new Point(1, 4));
color = weiqi.GetColor();
}
}
~~~
**注意:**如果是C++,抽象類一定要注意析構函數一定要是虛函數。
優缺點:
1. 優點,減少內存的使用。
1. 缺點,加大了結構的復雜度,需要單獨管理外部狀態。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《大話設計模式》
1. 《Head?First設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結