-1

我想要一些工厂(不管是抽象工厂模式还是工厂方法——看起来第二个是第一个的特定形式。在我的情况下,应该只创建一个对象)。问题是,尽管创造的产品是相似的,但它们取决于一些论据。

如何按照设计模式准备这个架构?

下面的当前方法

public abstract class Product {}

public class MyProduct : Product
{
    public bool Abc { get; set; }
}

public class YourProduct : Product {}

public abstract class ProductFactory
{
    //in some cases parameter not in use
    public abstract Product Create(HelpData additionalData);
}

public class MyProductFactory : ProductFactory
{
    public override Product Create(HelpData additionalData)
    {
        return new MyProduct {Abc = additionalData.SomethingImportantForMyProduct};
    }
}

public class YourProductFactory : ProductFactory
{
    //unused parameter
    public override Product Create(HelpData additionalData)
    {
        return new YourProduct();
    }
}

public class HelpData
{
    public bool SomethingImportantForMyProduct { get; set; }
}

编辑

我看不清楚,所以会重复。

通常我不会因为使用模式而使用模式。但这个问题似乎不是边界情况。看起来相当频繁。更进一步,我相信有适合于此的设计模式,但我不确定是哪一个。现在看起来抽象工厂不是正确的选择。

4

2 回答 2

1

不要使用设计模式,因为您正在使用设计模式。始终牢记何时使用,何时不使用。在您的情况下,至少抽象工厂模式是错误的,因为它假定所有工厂都使用相同的参数。所以如果你有不同的参数,你肯定需要不同的工厂。

但是,抽象工厂无法猜测HelpData在某些情况下如何获取 a 的实例,而在另一种情况下却不能,因此要么将其传递给每个抽象工厂,要么完全省略这个进一步的抽象并保留两个独立的工厂:

public abstract class Product {}

public class MyProduct : Product
{
    public bool Abc { get; set; }
}

public class YourProduct : Product {}

public class MyProductFactory
{
    public Product Create(HelpData additionalData)
    {
        return new MyProduct {Abc = additionalData.SomethingImportantForMyProduct};
    }
}

public class YourProductFactory
{
    //unused parameter
    public Product Create()
    {
        return new YourProduct();
    }
}

public class HelpData
{
    public bool SomethingImportantForMyProduct { get; set; }
}

将仅在一个工厂内使用的参数公开给所有工厂并不是一个好主意。

除此之外,想象一下您没有工厂,而是任何其他具有Create-method 的类,其中一个需要参数,而另一个不需要。当没有任何共同成员时,为什么这两个类应该派生自同一个基类(在您的情况下是抽象工厂)?显然没有理由这样做,所以不要为了使用不适合的模式而过度复杂化。

于 2017-04-13T06:31:05.643 回答
0

根据您检索其他数据的位置和方式,您可以将该数据注入工厂,工厂将使用它来构造对象:

public abstract class ProductFactory
{
    public abstract Product Create();
}

public class MyProductFactory : ProductFactory
{
    private HelpData additionalData;

    public MyProductFactory(HelpData additionalData)
    {
         this.additionalData = additionalData;
    }

    public override Product Create()
    {
        return new MyProduct {Abc = additionalData.SomethingImportantForMyProduct};
    }
}

public class YourProductFactory : ProductFactory
{
    public override Product Create()
    {
        return new YourProduct();
    }
}

HelpData您可以注入一个知道如何检索HelpData特定于正在创建的对象的服务,而不是传递给工厂的构造函数。Create如果两个工厂都使用它,您可以将其他一些参数传递给方法。

我也用谷歌搜索了一下,找到了很好的答案来解释为什么不https://stackoverflow.com/a/6241219/2138959。传递字典或具有字典类型属性的类型也是一种选择,但在这种方法中,客户端对要创建的类型了解太多以使用抽象工厂。

于 2017-04-12T19:05:57.473 回答