享元模式简介
使用共享对象可有效地支持大量的细粒度的对象。主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
何时使用:
- 系统中有大量对象。
- 这些对象消耗大量内存。
- 这些对象的状态大部分可以外部化。
- 这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
- 系统不依赖于这些对象身份,这些对象是不可分辨的。
大大减少对象的创建,降低系统的内存,使效率提高。
.net中用到享元模式的案例:
- string的驻留池;
- redis, db的连接池;
- 线程池 而不是每次new thread…
- Task -> 寄托在线程池上的线程。
C# 享元模式Demo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlyweightPattern
{
class Program
{
static void Main(string[] args)
{
FlyWeight flyWeight1 = Factory.CreateInstance(10);
flyWeight1.Run("bob");
FlyWeight flyWeight2 = Factory.CreateInstance(10);
flyWeight2.Run("Andy");
var b = flyWeight1.Equals(flyWeight2);
Console.WriteLine(b);
}
}
public abstract class FlyWeight
{
public abstract void Run(string str);
}
public class ConcreteFlyWeight : FlyWeight
{
public override void Run(string str)
{
Console.WriteLine("{0},你好", str);
}
}
public class UnSharedConcreteFlyWeight : FlyWeight
{
public override void Run(string str)
{
throw new NotImplementedException();
}
}
public class Factory
{
static Dictionary<int, FlyWeight> cache = new Dictionary<int, FlyWeight>();
public static FlyWeight CreateInstance(int num)
{
if (cache.ContainsKey(num))
{
return cache[num];
}
cache.Add(num, new ConcreteFlyWeight());
return cache[num];
}
}
}
测试结果:
参考资料
https://www.bilibili.com/video/av78515440?t=1331&p=20
更多: