良好的源代码可以让我在c#上的工厂设计模式上先行一步

时间:2011-07-27 13:27:22

标签: c# design-patterns factory-pattern factory-method

我觉得我应该开始在我的一些代码上使用工厂方法设计模式。这就是我在做的事情;

以下代码是Accom命名空间的生成器类:

namespace Accom {

    public class Generator {

      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 

          //some logic sits here.

          return somestring;

      }

      //Can have some other methods as well

    }

}

我也将为Traf命名空间启动相同的启动:

namespace Traf {
    public class Generator {
      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 
          //some logic sits here. Same one with the Accom.

          return somestring;
      }

      //Can have some other methods as well
    }
}

所以,这将一次又一次地重复。

我尝试为此创建一些工厂模式,但所有的抽象类都混合在一起,我很困惑(我认为这是因为这是我第一次尝试做类似的事情)。

任何人都可以帮我解决这个问题,并指出我能阅读并获得理解的良好源代码吗?

2 个答案:

答案 0 :(得分:0)

  • 为生成器
  • 创建一个抽象类
  • 为不同类型的生成器创建子类
  • 制作工厂类
  • 将工厂设为单身人士
  • 创建一个方法(Common),它将参数作为字符串(如果类在不同的名称空间中,则使用名称空间)
  • 使用反射在方法常用
  • 中创建不同对象的实例
  • 从常见的
  • 返回基本类型
  • 为获取不同的实例,调用方法(Common)
  • 创建不同的方法(A,B,C)
  • 将结果从common转换为你想要返回的类型

修改

public abstract class Generator
{
    public Generator(int? i, string name) { }
    public abstract string GetBaseUrl();
}

public class GeneratorA : Generator
{
    public GeneratorA(int? i, string name) : base(i, name) { }
}
public class GeneratorB : Generator
{
    public GeneratorB(int? i, string name) : base(i, name) { }
}
public class GeneratorFactory
{
    // Make singleton
    public GeneratorB GenerateB(int? i, string name)
    {
        return (GeneratorB)this.Generate(i, name, "GeneratorB");
    }

    public GeneratorA GenerateA(int? i, string name)
    {
        return (GeneratorA)this.Generate(i, name, "GeneratorA");
    }

    public Generator Generate(int? i, string name, string genType)
    {
        return new GeneratorA(); // use reflection to generate child generator based on string "genType"
    }
}

答案 1 :(得分:0)

我认为this code project article on the AbstractFactoryPattern在提供有用的示例方面做得非常好。

但是,除非您有充分的理由,否则不应在多个不同的命名空间中创建相同的类。您始终可以使用using Accom;从Traf名​​称空间访问Generator类。


编辑以回应注释,不同命名空间中的每个Generator将具有不同的方法集。

如果实现具有不同的方法,则不能使用抽象工厂模式。抽象工厂模式的想法是创建一个公共接口,工厂返回的所有对象都将实现,然后在工厂中使用一些上下文为给定的情况选择正确的实现。

使用工厂获得的优势称为Inversion of Control。基本上,您的客户端代码不依赖于Generator类的特定实现(通过具有该类型的变量,或通过为其调用构造函数)。

但是,如果您需要访问特定于实现的方法,那么您无法通过公共接口访问它们,这意味着您无法获得控制反转的好处,这意味着没有真正的原因使用抽象工厂模式。