建设者模式替代

时间:2011-06-01 17:00:53

标签: design-patterns

我在这里阅读有关构建器模式的好处:http://drdobbs.com/java/208403883?pgno=2

我想知道以下的可行性,这似乎更简单。

public class NutritionFactParams {
    private int servingSize;
    private int servings;
    private int fat_ = 0;
    private int sodium_ = 0;
    NutritionFactParams(int servingSize, int servings) {
        this.servingSize = servingSize;
        this.servings = servings;
    }
    NutritionFactParams fat(int fat) {
        this.fat_ = fat;
        return this;
    }
    NutritionFactParams sodium(int sodium) {
        this.sodium_ = sodium;
        return this;
    }
}

public class NutritionFacts {
    public NutritionFacts(NutritionFactParams params) {
        // copy values across, or store NutritionFactParams as member
    }
}

public class Main {
    public static void main(String args[]) {
        NutritionFacts n = new NutritionFacts(new NutritionFactParams(1,2).fat(23).soduim(10));
    }
}

这基本上是构建器模式,除了NutritionFacts构造函数是public而不是private,我们在NutritionFacts中没有静态Builder类,并且构建器上没有build()方法。没有替代或默认构造函数,因此如果没有首先构建NutritionFactsParams,就无法构建NutritionFact。

2 个答案:

答案 0 :(得分:3)

差异并不大,但我能想到一个重要的差异:

如果您使用构建器,客户端代码不需要知道您在构建()上实际返回的Impl,这意味着您可以根据配置(构建器)灵活地返回不同的Impl。另一方面,使用构造函数,客户端必须显式创建Impl。

答案 1 :(得分:2)

当您想要创建不可变对象但避免使用具有许多参数的构造函数时,构建器模式特别有用。

您使用的模式基本上只是fluent interface。构建器模式的应用程序通常使用一个流畅的接口。

另见:


如果您不喜欢使用构建器模式的额外代码开销,请查看make-builder