运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题 合理应用扬长避短
结构性设计模式:关注的是类与类之间的关系
.net设计模式 (享元模式)学习笔记
概要:使用场景 线程池 数据库连接池等等这种基于享元模式发开的。核心思想就是对象的重复使用。减少耗时操作的影响 优化相率 以空间(内存) 换时间
/// <summary>
/// 抽象方法
/// </summary>
public abstract class BaseWord
{
public int ID { get; set; }
public string Remark { get; set; }
public DateTime CreateTime { get; set; }
public abstract string DisPlay();
}
//////////////////////////////////// 四个继承
public class E : BaseWord
{
public E()
{
Thread.Sleep(1000);
Console.WriteLine("对象E构造中。。");
}
public override string DisPlay()
{
return "E";
}
}
public class L : BaseWord
{
public L()
{
Thread.Sleep(1000);
Console.WriteLine("对象L构造中。。");
}
public override string DisPlay()
{
return "L";
}
}
public class N : BaseWord
{
public N()
{
Thread.Sleep(1000);
Console.WriteLine("对象N构造中。。");
}
public override string DisPlay()
{
return "N";
}
}
public class V : BaseWord
{
public V()
{
Thread.Sleep(1000);
Console.WriteLine("对象V构造中。。");
}
public override string DisPlay()
{
return "V";
}
}
/// <summary>
/// 享元模式的 核心处理
/// </summary>
public class FlywightFactory
{
private static Dictionary<WordType, BaseWord> dicWord = new Dictionary<WordType, BaseWord>();
private static object dicLock = new object();
public static BaseWord GetWord(WordType type)
{
BaseWord word = null;
if (dicWord.ContainsKey(type))
{
word = dicWord[type];
}
else
{
lock (dicLock)///多线程 优化 ======> 双if加lock
{
if (dicWord.ContainsKey(type))
{
word = dicWord[type];
}
else
{
switch (type)
{
case WordType.E: word = new E();
break;
case WordType.L: word = new L();
break;
case WordType.V: word = new V();
break;
case WordType.N: word = new N();
break;
}
dicWord[type] = word;
}
}
}
return word;
}
}
public enum WordType
{
E,
L,
V,
N
}
/// <summary>
/// 使用实例
/// </summary>
class Program
{
static void Main(string[] args)
{
///享元模式的使用
BaseWord base1 = FlywightFactory.GetWord(WordType.E);
BaseWord base2 = FlywightFactory.GetWord(WordType.L);
BaseWord base3 = FlywightFactory.GetWord(WordType.V);
BaseWord base4 = FlywightFactory.GetWord(WordType.L);
BaseWord base5 = FlywightFactory.GetWord(WordType.E);
BaseWord base6 = FlywightFactory.GetWord(WordType.N);
///享元模式的使用不会对 原来的 类型 E,L,N 产生修改, 原有类型依然可以 直接 new();
BaseWord word0 = new E();
BaseWord word1 = new L();
BaseWord word2 = new N();
BaseWord word3 = new E();
}
}