2014-02-18 65 views
3

我在很多地方使用单例模式,有时构造函数什么也不做,有时候它是初始化事物。 我想知道是否有办法设置一个抽象类来最小化我的代码重复,也就是说,我不需要每个类中只有一个基类的public static readonly Singleton _Instance = new Singleton();。 我明白接口不是一个选项。C#单例模式

我试过使用以下内容(取自here);

public abstract class Singleton<T> where T : new() 
{ 
    static Singleton() 
    { 
    } 

    private static readonly T _Instance = new T(); 

    public static T Instance 
    { 
     get { return _Instance; } 
    } 
} 

这个问题是,我不能重写构造函数的情况下,我需要初始化的东西。 我试图做甚至可能吗?还是应该继续做我正在做的事情,而不是担心基础单身班?

+2

我建议你停止使用之间的单身清理全局状态。他们使软件更难以测试,并可以在代码库的大部分部分创建依赖关系。 –

回答

8

我想知道是否有建立一个抽象类,以尽量减少我的代码的重复有点

没有办法,没有。只要你有一个抽象类,你就有一个可以多次实例化的类。我见过不同的人尝试做这样的事情,但最终的结果不是单身,或者比只是做你已经做的更复杂。

我试图做甚至可能吗?还是应该继续做我正在做的事情,而不是担心基础单身班?

你不应该尝试创建一个基础单例类 - 但是如果我是你,我会试着在第一个地方停止使用相当多的单例。单例模式很容易被过度使用,它就等于反模式。看看你是否可以重构依赖注入,使用发生的配置来创建这些类中的每一个的只有一个实例,但是这是一个配置问题,而不是由类本身强制实施。

从别的

除此之外,涉及单身单元测试往往是一个痛苦,只是因为这是它需要测试等

+0

我得到了依赖注入的参数,我同意他们的使用应该是有限的,但是如果你在整个项目中需要这个类呢?这意味着你需要将它传递给类,然后传递给子类等等。这不是维护噩梦吗? – Simon

+0

@Simon:我很少发现我需要在很大比例的代码中使用相同的类,除了日志记录之外 - 这是我非常乐意坚持全局状态的几个地方之一。 –

+0

我也使用它主要用于记录/错误管理,软件的当前状态是否会计数?即如果我需要将当前位置存储在位置感知应用程序中,该模式是否适合/适合? – Simon