设计模式:工厂内的建造者

Design Patterns: Builder within a Factory

我想知道这是否是一种有效的设计模式实践。我目前正在设计一个代码,其中工厂内似乎有一个构建器。我可以闻到我当前设计中的一些不好的东西,但我无法确定它。代码看起来像这样...

class Program
{
    static void Main()
    {
        string productName = "productA";
        IProduct product1 = new Factory().GetNewProduct(productName);
    }
}

class Factory
{
    internal IProduct GetNewProduct(string name)
    {
        IProduct product = null;

        switch (name)
        {
            case "productA":
                product = new ProductA();
                break;
            case "productB":
                product = new ProductB();
                break;
            case "productC":
                product = new ProductC();
                break;
            default:
                throw new Exception("Invalid product type!");
        }

        //builder (sort of)            
        product.addPart1();
        product.addPart2();
        ...

        return product;
    }
}

你的方法的问题是没有任何灵活性 在构建 IProduct 对象时,所有对象都以相同的方式构建,因此如果明天需要以其他方式创建某个对象。您将不得不进行重大更改。我建议的是在 Builder class 中有一个 Factory 方法,如下所示

class Builder {

    IProduct product;

    public Builder(String type) {

        product = new Factory().getNewProduct(type);
    }

    public Builder addPart1() {

        product.addPart1();
        return this;
    }

    public Builder addPart2() {

        product.addPart2();
        return this;
    }

    public void build() {

        return product;
    }


    private class Factory {

        IProduct GetNewProduct(string name) {
            IProduct product = null;

            switch (name)
            {
                case "productA":
                    product = new ProductA();
                    break;
                case "productB":
                    product = new ProductB();
                    break;
                case "productC":
                    product = new ProductC();
                    break;
                default:
                    throw new Exception("Invalid product type!");
            }

            return product;
        }
    }
}

class Program {
    static void Main()
    {
        String productName = "productA";
        IProduct product1 = new Builder(productName)
                            .addPart1()
                            .addPart2()
                            .build();
    }
}

在这种方法中,您可以独立添加更多产品类型(在您的工厂方法中)并使用更多部分逐步构建您的对象:)