1

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

下面的代码是我的 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
    }
}

因此,这将一次又一次地重复。

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

任何人都可以在这方面帮助我并指出我可以阅读并从中理解的好的源代码吗?

4

2 回答 2

0

我认为这篇关于 AbstractFactoryPattern的代码项目文章很好地提供了一个有用的示例。

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


编辑以响应评论,即不同命名空间中的每个生成器将具有一组不同的方法。

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

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

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

于 2011-07-27T13:44:20.080 回答
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"
    }
}
于 2011-07-27T13:37:06.763 回答