享元是指一个可复用的对象,通过复用这个享元来减少应用中的内存分配。
享元模式是为了减少内存占用,尽可能复用已有对象的设计模式,一般来说会把这个可复用的对象放到一个外部的数据结构中,当需要使用到的时候传给享元。
享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。
具体来讲,当一个系统中存在大量重复对象的时候,我们就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以起到节省内存的目的。
实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段),提取出来设计成享元,让这些大量相似对象引用这些享元。
Samplepublic abstract class Flyweight{ public abstract voID Operation(int extrinsicstate);}public class ConcreteFlyweight : Flyweight{ public overrIDe voID Operation(int extrinsicstate) { Console.Writeline("operation in ConcreteFlyweight"); }}public class UnsharedFlyweight : Flyweight{ public overrIDe voID Operation(int extrinsicstate) { Console.Writeline("operation in UnsharedFlyweight"); }}public class FlyWeightFactory{ private Readonly ConcurrentDictionary<string,Flyweight> _flyweights = new ConcurrentDictionary<string,Flyweight>(); public Flyweight GetFlyweight(string name) => _flyweights.GetorAdd(name,n => new ConcreteFlyweight());}public class Program{ public static voID Main(string[] args) { var counter = 20; var factory = new FlyWeightFactory(); factory.GetFlyweight("X").Operation(counter--); factory.GetFlyweight("Y").Operation(counter--); factory.GetFlyweight("X").Operation(counter--); new UnsharedFlyweight().Operation(counter--); factory.GetFlyweight("X").Operation(counter--); Console.Writeline(counter); Console.Readline(); }}
More享元模式的代码实现非常简单,主要是通过工厂模式,在工厂类中,通过一个 Dictionary 或数组等 来缓存已经创建好的享元对象,以达到复用的目的,可以参考上面的示例。
来看一道经典的 C# 面试题目:
var a = "Hello World";var b = "Hello World";Console.Writeline(ReferenceEquals(a,b));
想一下输出结果是什么,不确定的话可以试一下哈
CLR 中 string 是一个特殊的类型,string 有一个字符串池(Intern
) 的实现就属于是享元模式的体现,这也是上面的输出结果的原因,相同的字符串变量值指向了同一块内存地址
以上是内存溢出为你收集整理的设计模式之享元模式全部内容,希望文章能够帮你解决设计模式之享元模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)