Please enable Javascript to view the contents

C# 享元模式

 ·  ☕ 2 分钟  ·  ✍️ YSL

在C#中,享元模式(Flyweight Pattern)是一种结构型设计模式,它用于减少程序中重复对象的数量,以便节省内存和提高性能。享元模式通过共享相同的对象来实现这一目标,从而减少了程序中需要创建的对象数量。在C#中,可以使用以下方式实现享元模式:

  1. 创建享元对象:在C#中,可以使用工厂模式或单例模式创建享元对象。享元对象通常是不可变的,它们包含程序中需要重复使用的数据和方法。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Flyweight {
    private string sharedData;

    public Flyweight(string data) {
        sharedData = data;
    }

    public void Operation() {
        Console.WriteLine(sharedData);
    }
}

在以上示例中,我们创建了一个 Flyweight 类,它包含一个字符串 sharedData 和一个方法 Operation。Flyweight 类的构造函数接受一个字符串参数 data,并将其赋值给 sharedData 字段。Operation 方法用于输出 sharedData 字段的值。

  1. 共享享元对象:在C#中,可以使用一个集合(例如字典)来存储共享的享元对象。程序员可以在需要重复使用对象时从集合中获取对象,而不是创建新的对象。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class FlyweightFactory {
    private Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>();

    public Flyweight GetFlyweight(string data) {
        if (!flyweights.ContainsKey(data)) {
            flyweights[data] = new Flyweight(data);
        }

        return flyweights[data];
    }
}

在以上示例中,我们创建了一个 FlyweightFactory 类,它包含一个字典 flyweights,用于存储共享的享元对象。GetFlyweight 方法接受一个字符串参数 data,并检查字典中是否已经存在一个对应的享元对象。如果不存在,则创建一个新的享元对象并存储到字典中。如果已经存在,则返回已有的享元对象。

  1. 使用享元对象:在C#中,可以使用 GetFlyweight 方法从 FlyweightFactory 中获取共享的享元对象,并调用其方法。例如:
1
2
3
4
5
6
7
FlyweightFactory factory = new FlyweightFactory();

Flyweight flyweight1 = factory.GetFlyweight("data1");
Flyweight flyweight2 = factory.GetFlyweight("data2");

flyweight1.Operation(); // 输出 "data1"
flyweight2.Operation(); // 输出 "data2"

在以上示例中,我们创建了一个 FlyweightFactory 对象 factory,并使用 GetFlyweight 方法从中获取共享的享元对象 flyweight1 和 flyweight2。然后,我们分别调用这两个对象的 Operation 方法,输出它们的 sharedData 字段的值。

需要注意的是,在使用享元模式时,应该避免共享可变状态的对象,因为这可能会导致程序的不稳定性和错误。享元对象应该是不可变的,它们的状态应该在创建时确定,并在整个生命周期中保持不变。另外,在使用享元模式时,应该权衡内存和性能的需求,以便在不损失程序可读性和可维护性的前提下,有效地利用共享的对象。