享元模式(Flyweight Pattern)是一种用于性能优化的模式,其核心是运用共享技术来有效支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度地减少单个实例的数目。
👻享元模式的主要有以下角色:
🐤抽象享元对象
- public interface IFlyweight
- {
- void Operation(int extrinsicstate);
- }
🐤具体享元
- public class ConcreteFlyweight : IFlyweight
- {
- public void Operation(int extrinsicstate)
- {
- Console.WriteLine("具体Flyweight:" + extrinsicstate);
- }
- }
🐤非享元
- public class UnsharedConcreteFlyweight : IFlyweight
- {
- public void Operation(int extrinsicstate)
- {
- Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);
- }
- }
🐤享元工厂
享元工厂负责创建和管理享元对象。
在这个工厂类中,有一个Hashtable类型的私有成员变量flyweights,它用于存储享元对象。在构造函数中,我们向这个Hashtable中添加了三个ConcreteFlyweight对象,并且为每一个对象指定了一个唯一的键值。然后,这个工厂类提供了一个GetFlyweight方法,这个方法接受一个字符串类型的键值作为参数,然后从Hashtable中取出对应的享元对象并返回。
所以,这段代码的主要作用就是创建和管理享元对象,当需要一个享元对象时,只需要调用GetFlyweight方法并传入对应的键值即可。这样就可以实现享元对象的共享,避免了大量相似对象的创建,从而节省了系统资源。
- public 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 IFlyweight GetFlyweight(string key)
- {
- return ((IFlyweight)flyweights[key]);
- }
- }
🐳测试类
- class MyClass
- {
- public static void Main(string[] args)
- {
- FlyweightFactory f = new FlyweightFactory();
-
- IFlyweight fx = f.GetFlyweight("X");
- fx.Operation(1);
-
- IFlyweight fy = f.GetFlyweight("Y");
- fy.Operation(2);
-
- IFlyweight fz = f.GetFlyweight("Z");
- fz.Operation(3);
-
- UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
- uf.Operation(4);
- }
- }
🐳运行结果

在这个案例中我们使用哈希表(Hashtable)来实现,创建一个哈希表并将对象放入其中。其中键是对象的外部状态,值是对应的享元对象。当需要使用对象时,可以从哈希表中获取已经创建的享元对象。