一次一个对象的实例,基于特定属性的值

时间:2014-05-18 22:56:45

标签: c# .net design-patterns

我正在编写一个应用程序来监视连接到计算机的USB驱动器,并为每个连接的驱动器维护一个单独的“活动日志”。我想确保每个连接的驱动器在给定时间只存在一个ActivityLog对象实例(维护我的活动日志的对象)。连接驱动器时会创建此实例,并在删除驱动器时将其销毁。

这样做的优雅方式是什么? (在C#中)。我正在考虑工厂和单例模式的一些组合(以创建ActivityLog对象),但我们会很感激一些指导。

提前致谢。

FIKE

1 个答案:

答案 0 :(得分:2)

隐藏ActivityLog对象的构造函数,方法是将其标记为私有...然后给它一些" factory"通过静态Get方法的能力:

class ActivityLog {
    private static IDictionary<string, ActivityLog> _currentLogs = new Dictionary<string, ActivityLog>();

    private ActivityLog() {
        // your constructor code here
    }

    public static ActivityLog Get(string key) {
        if (_currentLogs.ContainsKey(key)) {
            return _currentLogs[key];
        }

        var newLog = new ActivityLog();
        _currentLogs.Add(key, newLog);

        return newLog;
    }

基本上,您可以为每个USB设备分配自己的密钥(A Guid可能代替字符串?)并根据需要多次调用Get。每次调用它时,都会检查其内部列表中的密钥,并返回已创建的密钥..或者创建一个密钥并将其添加到内部列表中。

如果是多线程,你也可以用一些锁定机制包装它。