代码之家  ›  专栏  ›  技术社区  ›  Yordan Georgiev

在C#中使用工厂方法设计模式来管理不同的类版本是一个好主意吗?

  •  0
  • Yordan Georgiev  · 技术社区  · 16 年前

    下面的代码是(对我来说)编写和管理代码的新方法的一个小起点。在我放松几周并可能在最后说是的,这是个愚蠢的想法之前,我认为最好先在这里进行“压力测试”。

    这就是我的想法。每当客户机(Envoker)类使用服务器(提供某些服务的类-在下面的示例中称为控制器)时,存在该类型的依赖项时,客户机将使用一个静态方法来创建一个名为“stub”的“stub”,该名称将具有足够的通用性,以便该名称不必更改-例如CreateDynamicTextBox()或RunProcedureGetDataSet(),并将传递一个配置对象,工厂将根据该配置对象提供所请求的服务器类版本,因此每当有足够稳定的服务器版本时,必须向其添加新功能(或应更改其逻辑)并写入新的服务器类版本。建议的好处是通过通用方法和传递“设置”对象来保持流。

    这是个坏主意吗?!如果是,为什么?这种方法有什么好处吗?!

    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  
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Jon    16 年前

    对于这种情况,可以使用工厂模式。然而 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;
    
        2
  •  0
  •   Yordan Georgiev    16 年前

    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