C# GetInstance与lt;t>;和新t

C# GetInstance与lt;t>;和新t,c#,asp.net,.net,C#,Asp.net,.net,这个问题可能太模糊或太宽泛,但我想我应该试一试。我继承了一个大型.NET项目,遇到了一些以前从未见过的事情。我面临的最紧迫的问题是,这两项声明之间有什么区别?这两种类型都可以工作,并且在现有代码中都使用了这两种类型,但是我想知道,出于性能或安全原因,是否应该使用一种类型而不是另一种类型 var mgr = ManagerFactory.GetInstance<CustomerNotificationManager>(); 这两种方法都会产生CustomerNotificationM

这个问题可能太模糊或太宽泛,但我想我应该试一试。我继承了一个大型.NET项目,遇到了一些以前从未见过的事情。我面临的最紧迫的问题是,这两项声明之间有什么区别?这两种类型都可以工作,并且在现有代码中都使用了这两种类型,但是我想知道,出于性能或安全原因,是否应该使用一种类型而不是另一种类型

var mgr = ManagerFactory.GetInstance<CustomerNotificationManager>();
这两种方法都会产生
CustomerNotificationManager
类的实例,该类可用于中的任何方法

如果你需要更多的信息来回答我的问题,请告诉我。此外,如果这个问题是“可回答的”,请随意建议一个更好的标题

public class ManagerFactory
{
    private static bool singleton = false;

    private static Dictionary<string, ManagerBase> instanceHolder = new Dictionary<string, ManagerBase>();

    public static bool Singleton
    {
        get { return ManagerFactory.singleton; }
        set { ManagerFactory.singleton = value; }
    }

    public static T GetInstance<T>() where T : ManagerBase, new()
    {
        if (singleton)
        {

            return getSingletonInstance<T>();

        }
        else
        {
            return new T();
        }
    }

    private static T getSingletonInstance<T>() where T : ManagerBase, new()
    {
        lock (instanceHolder)
        {
            Type genericType = typeof(T);
            if (instanceHolder.ContainsKey(genericType.ToString()))
                return instanceHolder[genericType.ToString()] as T;
            else
            {
                var instance = new T();
                instanceHolder.Add(genericType.ToString(), instance);
                return instance;
            }
        }
    }

}
公共类管理器工厂
{
私有静态bool singleton=false;
private static Dictionary instanceHolder=new Dictionary();
公共静态布尔单态
{
获取{return ManagerFactory.singleton;}
设置{ManagerFactory.singleton=value;}
}
公共静态T GetInstance(),其中T:ManagerBase,new()
{
if(单件)
{
返回getsingletonistance();
}
其他的
{
返回新的T();
}
}
私有静态T getSingletonInstance(),其中T:ManagerBase,new()
{
锁(实例保持架)
{
类型genericType=typeof(T);
if(instanceHolder.ContainsKey(genericType.ToString()))
将instanceHolder[genericType.ToString()]返回为T;
其他的
{
var instance=newt();
添加(genericType.ToString(),实例);
返回实例;
}
}
}
}
这称为,其目的是将调用代码与返回实例的运行时类型以及对象创建的详细信息解耦

因此GetInstance可能会返回一些特殊的CustomerNotificationManager或MockCustomerNotificationManager等

在返回实例之前,它可能会对实例执行一些配置

或者它可能返回一个单例实例或对象池中的一个对象


所有这些东西都可以在以后更改,或者在单元测试等过程中以不同的方式工作,而不需要对使用CustomerNotificationManager的代码进行任何更改。

如果您检查
ManagerFactory.GetInstance
的代码,它可能不仅仅是执行
新建CustomerNotificationManager()
。如果工厂在那里,它也在那里,这是有原因的。@ChetanRanpariya我添加了
ManagerFactory
类。它似乎回归了单身,大卫的回答有点帮助,但我仍然感到困惑。困惑是什么?如果您了解单例,那么应该清楚的是,它不是关于如何创建对象,而是关于如何在整个应用程序生命周期中只允许创建一个类实例。@ChetanRanpariya为什么要使用一个而不是另一个,以及如何解释在解决方案的不同区域中使用这两种方法。在我的观点是,这个问题不是关于工厂和实例构造函数的问题,而是关于理解单例对象和非单例对象的创建。它返回的是一个单例,但我仍然不清楚其中一个的好处是什么,以及为什么它会在解决方案的不同部分中以两种方式使用。现在仔细看看这个类,我发现只有当bool集
为true
时,它才会返回单例。如果不是,那么两者之间没有区别,对吗?
public class ManagerFactory
{
    private static bool singleton = false;

    private static Dictionary<string, ManagerBase> instanceHolder = new Dictionary<string, ManagerBase>();

    public static bool Singleton
    {
        get { return ManagerFactory.singleton; }
        set { ManagerFactory.singleton = value; }
    }

    public static T GetInstance<T>() where T : ManagerBase, new()
    {
        if (singleton)
        {

            return getSingletonInstance<T>();

        }
        else
        {
            return new T();
        }
    }

    private static T getSingletonInstance<T>() where T : ManagerBase, new()
    {
        lock (instanceHolder)
        {
            Type genericType = typeof(T);
            if (instanceHolder.ContainsKey(genericType.ToString()))
                return instanceHolder[genericType.ToString()] as T;
            else
            {
                var instance = new T();
                instanceHolder.Add(genericType.ToString(), instance);
                return instance;
            }
        }
    }

}