享元模式——运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量相似类的开销,在软件开发中如果需要生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本上都是相同的,这时候就可以使用享元模式来大幅度减少需要实例化类的数量。如果能把这些参数(指的这些类实例不同的参数)移动类实例外面,在方法调用时将他们传递进来,这样就可以通过共享大幅度地减少单个实例的数目。
享元模式的使用场景:
当系统中大量使用某些相同或者相似的对象,这些对象要耗费大量的内存,并且这些对象剔除外部状态后可以通过一个对象来替代,这时可以考虑使用享元模式。在软件系统中享元模式大量用于各种池技术,如数据库连接对象池,字符串缓存池,HttpApplication池等。
享元模式的优点:
通过对象的复用减少了对象的数量,节省内存。
享元模式的缺点:
需要分离对象的外部状态和内部状态,使用不当会引起线程安全问题,提高了系统的复杂度。
namespace 享元模式
{
class Program
{
static void Main(string[] args)
{
CarFactory factory=new CarFactory();
Driver driver1=new Driver("小明");
factory.GetCar("红色").Use(driver1);
Driver driver2=new Driver("小白");
factory.GetCar("蓝色").Use(driver2);
Driver driver3 = new Driver("小红");
factory.GetCar("红色").Use(driver3);
Console.ReadKey();
}
}
//司机类
public class Driver
{
public string Name { get; set; }
public Driver(string name)
{
this.Name = name;
}
}
/// <summary>
/// 抽象享元角色类
/// </summary>
public abstract class Car
{
public abstract void Use(Driver driver);
}
/// <summary>
/// 具体享元角色:实现抽象享元角色所规定的接口。
/// </summary>
public class RealCar : Car
{
private string Color;
public RealCar(string color)
{
this.Color = color;
}
public override void Use(Driver driver)
{
Console.WriteLine(driver.Name+"开"+this.Color+"的车");
}
}
/// <summary>
/// 工厂类
/// </summary>
public class CarFactory
{
public Dictionary<string,Car> carPools=new Dictionary<string, Car>();
public CarFactory()
{
carPools.Add("红色",new RealCar("红色"));
carPools.Add("绿色", new RealCar("绿色"));
}
//获取汽车
public Car GetCar(string key)
{
// //如果车库有就用车库里的车,车库没有就买一个(new一个)
if (!carPools.ContainsKey(key))
{
carPools.Add(key,new RealCar(key));
}
return carPools[key];
}
}
}