陈巧倩

设计模式-享元模式

· 160 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

Flyweight享元模式属于结构型设计模式,旨在通过在相似对象之间共享数据来减少内存使用,以提高性能。

Design Pattern:Flyweight 🔗

基本介绍 🔗

构成 🔗

  • Flyweight:抽象享元类,规定出需要实现的公共接口,可以通过该接口接收外部状态并对其进行操作。
  • ConcreteFlyweight:具体享元类,实现抽象享元类所规定的接口,如果有内部状态的话,为内在状态添加存储。
  • FlyweightFactory:享元工厂类,创建和管理享元对象,当客户端请求享元时,享元工厂对象将现有实例赋值或创建一个实例。
  • Client:客户类,维护对享元的引用,计算或存储享元的外部状态。

优点 🔗

  • 通过创建共享对象(享元)来减少对象的数量,从而减少了内存,提高了性能。
  • 由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元对象能够在不同的环境被共享。

缺点 🔗

  • 需要区分外部状态和内部状态,使得代码在某种程度上来说更加复杂化了。
  • 为了使对象可以共享,享元模式需要将享元对象的状态外部化。

实例 🔗

C#中享元模式的实例,比方说我们开发一款画图工具,里面需要画各种颜色的圆形,我们不可能每种颜色的圆形做一个实例,这个时候我们可以享元模型,共享形状,然后添加不同的颜色。

public abstract class Shape
{
    /// <summary>
    /// 设置颜色值
    /// </summary>
    /// <param name="color"></param>
    public abstract void SetColor(string color);
    /// <summary>
    /// 绘制
    /// </summary>
    public abstract void Draw();
}

/// <summary>
/// 圆形
/// </summary>
public sealed class Circle : Shape
{
    private string _strColor;

    public override void SetColor(string color)
    {
        _strColor = color;
    }

    public override void Draw()
    {
        Console.WriteLine("Circle color " + _strColor);
    }
}

/// <summary>
/// 形状工程
/// </summary>
public sealed class ShapeFactory
{
    private static Dictionary<string, Shape> _shapes = new Dictionary<string, Shape>();

    public static Shape GetShape(string shapetype)
    {
        if (!_shapes.ContainsKey(shapetype))
        {
            //switch缩略写法
            switch (shapetype)
            {
                case "Circle":
                    {
                        var shape = new Circle();
                        _shapes.Add(shapetype, shape);
                    }
                    break;
            }
        }
        return _shapes[shapetype];
    }
}

实际运行:

Circle redCircle = (Circle)ShapeFactory.GetShape("Circle");
redCircle.SetColor("Red");
redCircle.Draw();

Circle greenCircle = (Circle)ShapeFactory.GetShape("Circle");
greenCircle.SetColor("Green");
greenCircle.Draw();

Circle orangeCircle = (Circle)ShapeFactory.GetShape("Circle");
orangeCircle.SetColor("Orange");
orangeCircle.Draw();

结论 🔗

搬砖愉快!