2009-05-15 5 views
0

コードは、コードの作成と管理の新しい方法(私にとっては)の小さな出発点です。私が何週間か緩んで、終わりにはいっていることを前に述べる前に、私は最初にここで "ストレステスト"をする方が良いと思ったばかげた考えでした。C#で異なるクラスバージョンを管理するためにFactoryメソッドのデザインパターンを使用することをお勧めしますか?

ここにその考えがあります。 Client(Envoker)クラスがServer(いくつかのサービスを提供するクラス - 以下の例ではControllerと呼ばれます)を使用するときに、クライアントはタイプの依存性があるたびに、クライアントは静的メソッドを使用して、この名前は変更する必要はありません。たとえば、CreateDynamicTextBox()またはRunProcedureGetDataSet()は、ファクトリが要求されたバージョンのServerクラスを提供する構成オブジェクトを渡します。したがって、十分なバージョンのサーバーが安定している新しい機能を追加する必要がある場合(またはそのロジックを変更する必要がある場合)、新しいサーバークラスのバージョンが記述されます。提案された利点は、一般的な方法によるフローの保存と「設定」オブジェクトの受け渡しになります。

これは悪い考えですか?はいの場合はなぜですか?このアプローチで肯定的なものは何ですか?

using System; 


namespace ControllerFactory 
{ 
    class ClientEnvoker 
    { 
    static void Main (string[] args) 
    { 

     Console.WriteLine (" START "); 
     ClientEnvoker objClientEnvoker = new ClientEnvoker(); 

     ControllerFactory objControllerFactory = new ControllerFactory(); 

     Console.WriteLine (" RUN METHOD 1 WITH CONTROLLER 1 WITH CONFIG 1 "); 
     objControllerFactory.GenericMethodName (ControllerFactory.CFSetter.First); 

     Console.WriteLine (" RUN METHOD 2 WITH CONTROLLER 2 WITH CONFIG 2 "); 
     objControllerFactory.GenericMethodName (ControllerFactory.CFSetter.Second); 

     Console.WriteLine (" RUN METHOD 3 WITH CONTROLLER 3 WITH CONFIG 3 "); 
     objControllerFactory.GenericMethodName (ControllerFactory.CFSetter.Second); 

     Console.WriteLine (" END HIT A KEY TO EXIT "); 
     Console.ReadLine(); 

    } //eof method 

    } //eof class 


    class ControllerFactory 
    { 
    public enum CFSetter : int 
    { 
     First = 1, 
     Second = 2 , 
     Third = 3 
    } 

    public void GenericMethodName (CFSetter objCFSetter) 
    { 
     Controller c = this.FactoryMethod (objCFSetter); 
     c.ConcreteMethod(); 
    } //eof method 

    public Controller FactoryMethod (CFSetter objCFSetter) 
    { 
     Controller controllerReturn = null; 
     switch (objCFSetter) 
     { 
     case CFSetter.First: 
      controllerReturn = new Controller1(); 
      break; 
     case CFSetter.Second: 
      controllerReturn = new Controller2(); 
      break; 
     case CFSetter.Third: 
      controllerReturn = new Controller3(); 
      break; 
     default: 
      controllerReturn = new Controller1(); 
      break; 
     } 
     return controllerReturn; 
    } 

    } //eof class 

    #region Controllers 
    public abstract class Controller 
    { 
    public abstract void ConcreteMethod(); 
    } 


    public class Controller1 : Controller 
    { 

    public override void ConcreteMethod() 
    { 
     Console.WriteLine ("Controller1 screams according to version 1 logic"); 
    } 
    } //eof class 

    public class Controller2 : Controller 
    { 

    public override void ConcreteMethod() 
    { 
     Console.WriteLine ("Controller2 screams according to version 2 logic"); 
    } 
    } //eof class 


    public class Controller3 : Controller 
    { 

    public override void ConcreteMethod() 
    { 
     Console.WriteLine ("Controller3 screams according to version 3 logic"); 
    } 
    } //eof class 

    #endregion Controllers 



} //eof namespace 

答えて

1

このような場合は、工場出荷時のパターンを使用しても問題ありません。しかし、FactoryMethod()は、インスタンス化するクラスを選択するロジックが存在する場所にする必要があります。また、FactoryMethod()がタイプControllerを返す場合、返されるオブジェクトをキャストする理由はありません。

あなたRunMethod()が...このような何かに

ControllerFactory cf = new ControllerFactory(); 
Controller c = cf.FactoryMethod(objCFSetter); 
c.Scream(); 

そして、あなたのFactoryMethod()は次のようになります...

Controller controllerReturn = null; 
switch (objCFSetter) { 
    case CFSetter.First: 
     controllerReturn = new Controller1(); 
     break; 
    case CFSetter.Second: 
     controllerReturn = new Controller2(); 
     break; 
    default: 
     controllerReturn = new Controller1(); 
     break; 
} 
return controllerReturn; 
+0

ありがとうございました。私はあなたが答える意味のコードを貼り付けなければなりませんでした(コメントにも構文強調があるはずです。) –

0

おかげで、ジョンを変更します。私はあなたが私が迷惑メールを掲示している実装を意味すると思う(もちろんそれを答えとして受け入れるつもりはない!)。はい、それは奇妙な静的メソッドで上記の私のコードよりも簡単だと思われる。それでも、これは同じ「機能」ですか?このタイプの「ホットスワップ」が頻繁に使用される場合や、どのような状況で使用できるか(動的制御の生成とデータベースプロバイダの動的選択について考えています)

using System; 


namespace ControllerFactory 
{ 
    class ClientEnvoker 
    { 
    static void Main (string[] args) 
    { 

     Console.WriteLine (" START "); 
     ClientEnvoker objClientEnvoker = new ClientEnvoker(); 

     ControllerFactory cf = new ControllerFactory(); 

     Console.WriteLine (" RUN METHOD 1 WITH CONTROLLER 1 WITH CONFIG 1 "); 
     cf.RunMethod (ControllerFactory.CFSetter.First); 

     Console.WriteLine (" RUN METHOD 2 WITH CONTROLLER 1 WITH CONFIG 2 "); 
     cf.RunMethod (ControllerFactory.CFSetter.Second); 


     Console.WriteLine (" END HIT A KEY TO EXIT "); 
     Console.ReadLine(); 

    } //eof method 

    } //eof class 


    class ControllerFactory 
    { 
    public enum CFSetter : int 
    { 
     First = 1, 
     Second = 2 
    } 

    public void RunMethod (CFSetter objCFSetter) 
    { 
     Controller c = this.FactoryMethod (objCFSetter); 
     c.Scream(); 
    } //eof method 

    public Controller FactoryMethod (CFSetter objCFSetter) 
    { 
     Controller controllerReturn = null; 
     switch (objCFSetter) 
     { 
     case CFSetter.First: 
      controllerReturn = new Controller1(); 
      break; 
     case CFSetter.Second: 
      controllerReturn = new Controller2(); 
      break; 
     default: 
      controllerReturn = new Controller1(); 
      break; 
     } 
     return controllerReturn; 
    } 

    } //eof class 

    #region Controllers 
    public abstract class Controller 
    { 
    public abstract void Scream(); 
    } 


    public class Controller1 : Controller 
    { 

    public override void Scream() 
    { 
     Console.WriteLine ("Controller1 screams according to version 1 logic"); 
    } 
    } //eof class 

    public class Controller2 : Controller 
    { 

    public override void Scream() 
    { 
     Console.WriteLine ("Controller2 screams according to version 2 logic"); 
    } 
    } //eof class 

    #endregion Controllers 



} //eof namespace 
+0

まあ、私は誤ってswitch文にCFSetter.Thirdを残しました...しかし、はいこれは同じ機能ですが、基本的にMain()はどのタイプのControllerがインスタンス化されるのか(それは気にしません)、ControllerFactoryの目的です。コントローラーでScream()の機能とMain()のコードを変更する必要はありません。リストされた状況はこのタイプのパターンを使用するのに理にかなっています。 –

関連する問題