享元模式(Flyweight) 定義 享元模式(Flyweight),運用共用技術有效地支持大量細粒度的對象。 類圖 描述 Flyweight:抽象享元類,是所有的具體享元類的基類,為子類規定出需要實現的公共介面。那些需要外部狀態的操作可以通過調用Flyweight的方法並以參數的形式傳入。 Con ...
享元模式(Flyweight)
定義
享元模式(Flyweight),運用共用技術有效地支持大量細粒度的對象。
類圖
描述
Flyweight:抽象享元類,是所有的具體享元類的基類,為子類規定出需要實現的公共介面。那些需要外部狀態的操作可以通過調用Flyweight的方法並以參數的形式傳入。
ConcreteFlyweight:具體享元類,實現抽象享元角色所規定的介面。如果有內部狀態的話,可以在類內部定義。
FlyweightFactory:享元工廠,用來創建和管理享元對象,主要用來確保合理地共用Flyweight,當用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話)。
內部狀態:是指在享元對象內部並且不會隨環境改變而改變的共用部分,內部狀態存儲於ConcreteFlyweight對象中;
外部狀態:是指隨環境改變而改變、不可以共用的部分,外部狀態存儲於外部對象中,當調用Flyweight對象的操作時,將外部狀態傳遞給Flyweight對象。
享元模式可以看作是一種最簡單的緩存技術的實現。
應用場景
public class Student { private string name; public string Name { get { return name; } } public Student(string name) { this.name = name; } } public abstract class AbstractCourse { public abstract void Print(Student student); } public class Course : AbstractCourse { /// <summary> /// 課程名稱 /// </summary> private string name; /// <summary> /// 課時 /// </summary> private int periods; public Course(string name, int periods) { this.name = name; this.periods = periods; } public override void Print(Student student) { Console.WriteLine(student.Name + ":\t" + this.name + "(" + this.periods + "課時)"); } } public class CourseFactory { private Dictionary<string,Course> courses = new Dictionary<string,Course>(); /// <summary> /// 獲取課程 /// </summary> /// <param name="name"></param> /// <param name="periods"></param> /// <returns></returns> public Course GetCourse(string name, int periods) { if (!this.courses.ContainsKey(name)) //如果不存在相應的課程就新建一個課程實例 { courses.Add(name, new Course(name, periods)); } return this.courses[name]; } /// <summary> /// 獲取開課總數 /// </summary> /// <returns></returns> public int GetCourseCount() { Console.WriteLine("開課總數:" + this.courses.Count); return this.courses.Count; } }
享元模式和單例模式的區別:
享元是對象級別的, 即多個相同的對象在共用區里只保存一個對象;
單例是類級別的, 即該類只能實例化出來一個對象。