整个应用程序中使用的单个对象应该是静态的吗?

时间:2014-05-10 20:26:49

标签: c# design-patterns static

我正在编写一个基于历史价格分析股票的C#应用​​程序。我有一个保存数据的对象(历史价格)。所有数据都保存在这个对象中 - 我只需要一个实例,整个应用程序中的许多其他对象都会使用这些数据。

鉴于上述情况,使这个对象静态不是更容易(也是更好的设计)吗?因为替代方案是我目前正在做的事情 - 在对象之间传递数十个对同一个实例的引用。

我仍然犹豫不决的原因是我知道static对象应该得到认真对待,因为我读过this answer。在我的例子中,对象不是一个简单的实用对象,它不是无状态的。数据被加载到对象中并对其进行更改,但我的想法是这些更改仍然需要在所有其他对象之间共享,我知道我不需要有两个不同的数据对象实例。

您对我的最佳方法有什么看法?有没有我不考虑的替代解决方案?

4 个答案:

答案 0 :(得分:5)

您可以将其设为静态或使用Singleton设计模式。我会使用Singleton。

不需要传递引用,Singleton提供了一个全局访问点。

示例:

public class Singleton
{
    private static Singleton instance;

    private Singleton()
    {}

    public static Singleton GetInstance()
    {
        if(instance == null)
           instance = new Singleton();

        return instance;
    }
}

私有构造函数和GetInstance()函数确保只有一个对象实例。

如果您需要获取对象的引用来调用对象内的函数,请使用:

Singleton.GetInstance().FunctionName();

此外,这是懒惰的实例化而不是线程安全的(多线程程序),但你可以自己了解更多,这应该很有趣!

答案 1 :(得分:2)

如果您的对象有状态,然后而不是使其成为静态或单身,我建议使用dependency injection design pattern

这样,您可以根据具体情况将该对象或类替换为不同的对象或类,例如一个用于生产代码,另一个用于测试。

可以用各种依赖注入样式解析实例,例如

  • 构造函数注入

  • 物业注入

  • 控制容器的反转(例如CommonServiceLocator

  • 配置文件

在所有这些选项中,您使用要使用的公共协定定义接口或基类,然后确定在使用代码之外实现接口的实际类/实例,以便您可以在不更改代码的情况下更改决策

答案 2 :(得分:1)

对于你想要的东西,我会说单身。这一切都取决于偏好。静态使得您的类无法实例化,因此您使用className.myMethod()。如果您的数据检索没有在构造函数中完成并且您使用方法来提取数据,那就没问题。但是,如果构造函数具有连接凭据,则需要将其移动到可以调用的新方法。 Singleton可以限制为单个实例。您可以测试两者,看看哪种方式最适合您。

答案 3 :(得分:0)

使用单例模式怎么样? http://en.wikipedia.org/wiki/Singleton_pattern 没有参考必须通过。它可能有助于更容易地再次改变设计。