GetInstance <t>和New t之间的区别

时间:2017-06-27 00:47:39

标签: c# asp.net .net

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

var mgr = ManagerFactory.GetInstance<CustomerNotificationManager>();

VS

CustomerNotificationManager cNotificationMgr = new CustomerNotificationManager();

两者都会产生CustomerNotificationManager类的实例,可以用于。{/ p>中的任何方法

如果您需要更多信息(希望)回答我的问题,请告诉我。此外,如果这个问题是“可回答的”,请随意提出更好的标题。

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;
            }
        }
    }

}

1 个答案:

答案 0 :(得分:1)

这称为Factory Pattern,它旨在将调用代码与返回的实例的运行时类型以及对象创建的细节分离。

因此GetInstance可能会返回SomeSpecialCustomerNotificationManager或MockCustomerNotificationManager等。

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

或者它可能从对象池返回单例实例或对象。

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

相关问题