在相关类层次结构中实现工厂方法

时间:2016-04-05 20:33:03

标签: c# inheritance design-patterns polymorphism

请参阅代码:

class X
{
  public string x;
}

class Y : X
{
  public string y;
}

class A
{
  string a;
  public virtual X createX<T>()
    where T : X, new()
  {
    return new T() { x = a };
  }
}

class B : A
{
  string b;
  public override X createX<T>()
  {
    var x = base.createX<T>();
    if (x is Y)
      ((Y)x).y = b; // Yak.
    return y;
  }
}

...
var c = new B();
var z = c.createX<Y>(); // Yak. I prefer to not needing to know the type Y

我不喜欢这段代码,试图想出更好的方法来重构它。一般的想法很简单,层次结构的每个类都有工厂方法来生成镜像层次结构的对应类的实例。我得到了一个根类或衍生类的实例,需要返回对应类的实例或其派生类(作为根对应类)。我可以实现任何想法或设计模式吗?

2 个答案:

答案 0 :(得分:1)

这就是我最终的结果。所有的yacks删除。但它有点冗长。

class X
{
  public string x;
}

class Y : X
{
  public string y;
}

class A
{
  string a;
  protected void setX(X x)
  {
    x.x = a;
  }
  public virtual X createX()
  {
    var x = new X();
    setX(x);
    return x;
  }
}

class B : A
{
  string b;
  protected void setY(Y y)
  {
    base.setX(y);
    y.y = b;
  }
  public override X createX()
  {
    var y = new Y();
    setY(y);
    return y;
  }
}

...
var c = new B();
var z = c.createX();

答案 1 :(得分:0)

这可能是你想要的吗?

class BaseProduct
{
    public string x;
}

class ChildProduct : BaseProduct
{
    public string y;
}

class BaseFactory
{
    string a;
    public virtual BaseProduct buildProduct(BaseProduct product = null)
    {
        if (product == null)
            product = new BaseProduct();

        product.x = a;
        return product;
    }
}

class ChildFactory : BaseFactory
{
    string b;
    public override BaseProduct buildProduct(BaseProduct product = null)
    {
        if (product == null)
            product = new ChildProduct();
        //else if (!(product is ChildProduct))
        //  return null or throw exception

        ((ChildProduct)product).y = b;
        return base.buildProduct(product); //build BaseProduct.x
    }
}

...
var cFactory = new ChildFactory();
var cProduct = c.buildProduct(); //create a ChildProduct with x=a, y=b
  

buildProduct确定是否已请求创建新的   它自己的产品,或者一些派生工厂要求它建造它的产品   只有自己的部分

     

您应该提供自己的一些保护机制,例如检查   产品是否是来自ChildProduct的派生类   ChildFactory.buildProduct。这将避免用户传递类似的内容:
  childFactory.buildProduct(new BaseProduct()); //yak