Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 很好的源代码可以让我在c上的工厂设计模式上领先一步#_C#_Design Patterns_Factory Pattern_Factory Method - Fatal编程技术网

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

C# 很好的源代码可以让我在c上的工厂设计模式上领先一步#,c#,design-patterns,factory-pattern,factory-method,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;

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

以下代码是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
    }
}
因此,这将一次又一次地重复

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

有谁能帮我找到好的源代码,让我读一读并从中得到启发吗?

  • 为生成器创建一个抽象类
  • 为不同类型的生成器创建子类
  • 制造工厂级
  • 使工厂成为单身汉
  • 创建一个将参数作为字符串的方法(公共)(如果类位于不同的命名空间中,则使用命名空间)
  • 使用反射在公共方法中创建不同对象的实例
  • 从common返回基类型
  • 为不同的实例创建不同的方法(A、B、C),调用方法(Common)
  • 将结果从common强制转换为要返回的类型u
编辑

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"
    }
}
我认为在提供一个有用的例子方面做得相当好

但是,除非有很好的理由,否则不应该在几个不同的名称空间中创建同一个类。您可以随时使用Accom使用
从Traf命名空间访问生成器类


编辑以响应注释,即不同命名空间中的每个生成器将具有不同的方法集

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

通过使用工厂获得的优势称为。基本上,您的客户机代码不依赖于生成器类的特定实现(通过拥有该类型的变量,或者通过调用构造函数)


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

请您解释一下为什么要使用名称空间,以便可以有两个同名的类。这感觉不“对”。@chibacity我正试图把这里的逻辑分开。位于不同命名空间上的所有类都将具有不同的方法。命名空间通常不会用于实现这种分离。如果您的所有类都应该具有相同的“接口”,例如支持GetBaseUrl方法,但实现该方法的方式不同,那么如果它们具有一些公共代码,或者您的所有类都支持接口,则您通常会使用继承来实现这一点。这些都是基本的设计考虑,值得我在评论中给予更多的质疑和解释,而不是做一个单独的工厂,考虑使用一个。这实际上是一个超级工厂。@hungryMind一些代码会很棒。有些部分我还不清楚(无意冒犯,这与我有关。)