我觉得我应该开始在我的一些代码上使用工厂方法设计模式。这就是我在做的事情;
以下代码是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
}
}
所以,这将一次又一次地重复。
我尝试为此创建一些工厂模式,但所有的抽象类都混合在一起,我很困惑(我认为这是因为这是我第一次尝试做类似的事情)。
任何人都可以帮我解决这个问题,并指出我能阅读并获得理解的良好源代码吗?
答案 0 :(得分:0)
修改强>
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类的特定实现(通过具有该类型的变量,或通过为其调用构造函数)。
但是,如果您需要访问特定于实现的方法,那么您无法通过公共接口访问它们,这意味着您无法获得控制反转的好处,这意味着没有真正的原因使用抽象工厂模式。