一句话的概要
运用共享技术支持大量的对象。享元模式可以避免大量类似的开销。
剧情
女神跟小明,打算创建一个小团队来进行CS。他们邀请小刚加入,后面也会有更多的人加入。
我们看一下,每个人的不同之处。就是性别和名字。然而只是为了这个去创建新的对象,会造成大量的相似类的开销。
这个时候,我们就用共享技术,来避免相同的开销。下面用享元模式来构造以上剧情。
任务一:创建小团队并让他们介绍自己的方法
首先我们创建抽象类。然后我们创建小明的这个团队。
public abstract class Team { public abstract void Introduce(string strSex); } public class SomeMTeam : Team { private string name; public SomeMTeam(string strName) { this.name = strName; } public override void Introduce(string strSex) { Console.WriteLine("姓名," + name + "。性别," + strSex); } }
任务二:创建共享工厂
我们创建一个共享工厂,来实现实例共享功能。
首先,我们团队建立的时候,就有小明和女神。建立成功以后,小刚才进入团队。
public class TeamFactory { public Dictionary<string, Team> teamList = new Dictionary<string, Team>(); public TeamFactory() { teamList.Add("小明", new SomeMTeam("小明")); teamList.Add("女神", new SomeMTeam("女神")); } public Team GetTeam(string key) { Team team = null; if (teamList.ContainsKey(key)) return teamList[key] as Team; else { Console.WriteLine("新人加入"); team = new SomeMTeam(key); return team; } } }
这里,我们用键值对来实现共享。提取一个获取方法,如果没有共享则新加入对象。
任务三:测试执行
我们测试执行,看能否成功。
static void Main(string[] args) { Console.WriteLine("小明和女神创建一个小团队"); TeamFactory fa = new TeamFactory(); Team teamM = fa.GetTeam("小明"); teamM.Introduce("男"); Team nvS = fa.GetTeam("女神"); nvS.Introduce("女"); Team teamG = fa.GetTeam("小刚"); teamG.Introduce("男"); Console.ReadLine(); }
我们看一下,执行结果
总结
共享模式就是运用共享技术避免大量相似的开销。
常用场景:一些状态相同的对象被大量的重复使用。
选择关键点:被共享的对象是否可以从外部状态提取出来。
时间: 2024-11-05 05:04:30