生成器模式的替代方案

4

我在这里阅读了有关生成器模式的好处: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私有构造函数不同的是,它是公共构造函数。我们没有在NutritionFacts内部创建静态Builder类,并且构建器上没有build()方法。由于没有备用或默认构造函数,因此您不能在先构造NutritionFactsParams之前构建NutritionFacts。


顺便说一句,(加载缓慢的)DDJ文章只是《Effective Java, Item 2》的链接。 - Matt Ball
2个回答

3

两个版本都支持不可变性和无长构造函数。 - Op De Cirkel
我最初看到提出用于C ++的这种模式,是作为实现类似于其他语言中存在的命名参数的一种方式。 - Kevin
@Matt Ball的make-builder链接无法使用,你能提供一些替代链接吗? - Jimit Patel

3

区别不是很大,但我能想到一个重要的区别:

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


如果引入一个接受参数对象的工厂,您就可以获得返回不同实现的好处。 - Kevin
你可以用多种方式完成同一件事情。该构建器是一个类中的工厂+配置。请参见:http://dadraraghu.blog.com/wp-content/blogs.dir/00/03/05/16/3051643/files/design-patterns/relationship-in-dp.jpg - Op De Cirkel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接