Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 生成器模式替代方案_Design Patterns - Fatal编程技术网

Design patterns 生成器模式替代方案

Design patterns 生成器模式替代方案,design-patterns,Design Patterns,我在这里读到了构建器模式的好处: 我想知道下面这个似乎更简单的方法的可行性 public class NutritionFactParams { private int servingSize; private int servings; private int fat_ = 0; private int sodium_ = 0; NutritionFactParams(int servingSize, int servings) { th

我在这里读到了构建器模式的好处:

我想知道下面这个似乎更简单的方法的可行性

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中没有静态构建器类,并且构建器上没有build()方法。没有备用构造函数或默认构造函数,因此如果不先构建NutritionFactsSparams,就无法构建NutritionFacts。

当您希望创建不可变对象但避免使用具有许多参数的构造函数时,构建器模式尤其有用

你使用的模式基本上只是一个简单的例子。builder模式的应用程序通常使用流畅的界面

另见:



如果您不喜欢使用builder模式带来的额外代码开销,请看一看。

差别不大,但我可以想到一个重要的差别:


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

BTW(缓慢加载)DDJ文章是公正的。两个版本都支持不可变,并且没有长的构造者第一次看到C++所提出的模式是一种实现类似于其他语言中的命名参数的方法。你能给出一些替代链接吗?如果引入了一个接受param对象的工厂,那么返回不同impl的好处就来了。你可以用很多方法做同样的事情。生成器是一个类中的factory+配置。见: