享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少许的对象,而这些对象都很类似,状态变化很小,能够实现对象的屡次复用。因为享元模式要求可以共享的对象必须是细粒度对象,所以它又称为轻量级模式,它是一种对象结构型模式。git
Flyweight类:github
namespace FlyweightPattern.BasicStructure { abstract class Flyweight { public abstract void Operation(int extrinsicState); } }
ConcreteFlyweight类:web
namespace FlyweightPattern.BasicStructure { class ConcreteFlyweight : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("具体Flyweight:" + extrinsicState); } } }
UnSharedConcreteFlyweight类:编程
namespace FlyweightPattern.BasicStructure { class UnSharedConcreteFlyweight : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("不共享的具体Flyweight:" + extrinsicState); } } }
FlyweightFactory类:ide
namespace FlyweightPattern.BasicStructure { class FlyweightFactory { private Hashtable flyweights = new Hashtable(); public FlyweightFactory() { flyweights.Add("X", new ConcreteFlyweight()); flyweights.Add("Y", new ConcreteFlyweight()); flyweights.Add("Z", new ConcreteFlyweight()); } public Flyweight GetFlyweight(string key) { return (Flyweight)flyweights[key]; } } }
客户端调用代码:网站
static void Main(string[] args) { try { {//BasicStructure int extrinsicState = 22; FlyweightFactory flyweightFactory = new FlyweightFactory(); var flyweight = flyweightFactory.GetFlyweight("X"); flyweight.Operation(--extrinsicState); flyweight = flyweightFactory.GetFlyweight("Y"); flyweight.Operation(--extrinsicState); flyweight = flyweightFactory.GetFlyweight("Z"); flyweight.Operation(--extrinsicState); UnSharedConcreteFlyweight uf = new UnSharedConcreteFlyweight(); uf.Operation(--extrinsicState); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果以下:this
场景模拟:因为多个客户须要作网站,其中有一些客户的网站是基本同样的,只有数据不同。spa
WebSite(网站抽象)类——Flyweight类code
namespace FlyweightPattern.SituationSimulation { /// <summary> /// 网站抽象类 /// </summary> abstract class WebSite { public abstract void Use(); } }
ConcreteWebSite(具体网站)类——ConcreteFlyweight类对象
namespace FlyweightPattern.SituationSimulation { /// <summary> /// 具体网站类 /// </summary> class ConcreteWebSite : WebSite { public string Name { get; } public ConcreteWebSite(string name) { this.Name = name; } public override void Use() { Console.WriteLine("网站分类:" + Name); } } }
WebSiteFactory(网站工厂)类——FlyweightFactory类
namespace FlyweightPattern.SituationSimulation { class WebSiteFactory { private Hashtable flyweights = new Hashtable(); public WebSite GetWebSiteCategory(string key) { if (!flyweights.ContainsKey(key)) flyweights.Add(key, new ConcreteWebSite(key)); return (WebSite)flyweights[key]; } public int GetWebSiteCount() { return flyweights.Count; } } }
客户端调用代码:
static void Main(string[] args) { try { {//SituationSimulation WebSiteFactory webSiteFactory = new WebSiteFactory(); var fx = webSiteFactory.GetWebSiteCategory("产品展现"); fx.Use(); var fy = webSiteFactory.GetWebSiteCategory("产品展现"); fy.Use(); var fz = webSiteFactory.GetWebSiteCategory("产品展现"); fz.Use(); var fl = webSiteFactory.GetWebSiteCategory("博客"); fl.Use(); var fm = webSiteFactory.GetWebSiteCategory("博客"); fm.Use(); var fn = webSiteFactory.GetWebSiteCategory("博客"); fn.Use(); Console.WriteLine($"网站分类总数为:{webSiteFactory.GetWebSiteCount()}"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果以下:
享元模式的优势
享元模式的缺点
在如下状况下可使用享元模式: