享元模式

本文借鉴《大话设计模式》,算是对自己学习的总结,也希望分享下所学知识~~

1.享元模式(FlyWeight):
运用共享技术有效地支持大量细粒度的对象。

享元模式可以避免大量非常相似的类的开销。
如果某些大量生产的实例除了几个参数外基本上是相同的,就可以使用。
把那些参数移到类的外面,在方法调用时将他们传递进来,可以大幅度减少单个实例的数目。

case 1:
不同的用户玩游戏机
每一个用户都需要一个游戏机玩
游戏机本身是一个对象,但是游戏机本身是很类似的
所以把用户提取出来当参数,游戏机采用共享对象的模式

1.声明用户和游戏机类

class User
{
    public string Name { get; set; }
}

class GameConsole
{
    public string Name { get; set; }
    public void Use(User user)
    {
        Console.WriteLine(user.Name + "正在玩游戏机!");
    }
}

2.游戏机工厂类

class GameConsoleFactory
{
    Dictionary flyWeightDict = new Dictionary();

    public GameConsole Get(string key)
    {
        if (!flyWeightDict.ContainsKey(key))
        {
            flyWeightDict.Add(key, new GameConsole() { Name = key });
        }
        return flyWeightDict[key];
    }
}

3.使用

GameConsoleFactory factory = new GameConsoleFactory();

GameConsole sony1 = factory.Get("sony");
sony1.Use(new User() { Name = "小明" });

GameConsole sony2 = factory.Get("sony");
sony2.Use(new User() { Name = "小菜" });

GameConsole sony3 = factory.Get("sony");
sony3.Use(new User() { Name = "小赵" });

GameConsole sony4 = factory.Get("sony");
sony4.Use(new User() { Name = "小张" });

其他应用:
字符串内部就是使用的享元模式优化。

string str1 = "这是一样的内容哦";
string str2 = "这是一样的内容哦";
Console.WriteLine(object.ReferenceEquals(str1, str2));//返回true,代表是共享一个对象

你可能感兴趣的:(享元模式)