2017-06-27 10 views
0

この質問はあまりにも漠然としているかもしれませんが、私はそれにショットを与えると思いました。私は大規模な.NETプロジェクトを継承し、以前は見たことのないいくつかの事柄にぶつかってきました。私が持っている最も緊急の質問は、これら2つの宣言の違いは何でしょうか?両方とも動作し、両方の型は既存のコードで使用されていますが、パフォーマンスやセキュリティ上の理由から、どちらか一方を他のものよりも使用する必要があるのだろうかと思います。GetInstance <t>とNew tの相違点

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

CustomerNotificationManager cNotificationMgr = new 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; 
      } 
     } 
    } 

} 
+0

'ManagerFactory.GetInstance'のコードをチェックすると、' new CustomerNotificationManager() 'だけではないかもしれません。また、その工場がある場合は理由があります。 –

+0

@ChetanRanpariya私は 'ManagerFactory'クラスを追加しました。シングルトンを返すようだが、Davidの答えはちょっと助けになったが、私はまだ混乱している。 – TheValyreanGroup

+0

混乱は何ですか?シングルトンを理解していれば、オブジェクトの作成方法ではなく、アプリケーションのライフサイクル全体でクラスのインスタンスを1つだけ作成する方法を明確にする必要があります。 –

答えて

1

これはFactory Patternと呼ばれ、返されるインスタンスのランタイム型の両方からの呼び出しコード、およびオブジェクトの作成の詳細を分離することを意図しています。

そうでGetInstanceはSomeSpecialCustomerNotificationManagerを返す、またはMockCustomerNotificationManagerなど

そして、それはそれを返す前に、インスタンス上でいくつかの設定を行う場合があります。

または、単一インスタンスまたはオブジェクトプールからオブジェクトを返すことがあります。

後でに変更したり、Unit TestingなどでCustomerNotificationManagerを使用するコードを変更することなく別の方法で動作させることができます。

+0

私は、 'ManagerFactory'クラスを投稿に追加しました。シングルトンを返していますが、どちらか一方のメリットとソリューションの別の部分で両方の方法で使用される理由についてはまだ混乱しています。 – TheValyreanGroup

+0

そして、クラスを見てみると、ブールがtrueに設定されているとシングルトンだけが返されることがわかります。そうでない場合は、2つの間に違いはありません、正しい? – TheValyreanGroup

関連する問題