参数化抽象工厂/工厂方法/其他创建模式

Parametrized Abstract Factory / Factory Method / other creation patterns

我想要一些工厂(抽象工厂模式或工厂方法无关紧要 - 看起来第二种是第一种的特定形式。在我的例子中,只应创建一个对象)。问题是,尽管创建的产品相似,但它们取决于一些论点。

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

下面的当前方法

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; }
}

编辑

我看不清楚所以会重复。

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

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

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 方法。

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

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

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

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; }
}

将仅在 one 工厂中使用的参数公开给 all 工厂不是一个好主意。

除此之外,假设您没有工厂,而是任何其他具有 Create 方法的 classes,其中一个需要参数,而另一个不需要。为什么这两个 classes 应该派生自相同的 base-class (在你的例子中是抽象工厂),而它们没有任何共同的成员?这显然没有任何理由,所以不要为了使用不适合的模式而将事情复杂化。