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
Design patterns 建设者模式如何在it中使用singleton';什么是工具?_Design Patterns_Singleton_Builder - Fatal编程技术网

Design patterns 建设者模式如何在it中使用singleton';什么是工具?

Design patterns 建设者模式如何在it中使用singleton';什么是工具?,design-patterns,singleton,builder,Design Patterns,Singleton,Builder,我遇到了几个关于作为单例实现的构建器模式的引用: 摘自:“抽象工厂、构建器和原型可以在其实现中使用单例” 构建器模式如何实现单例?当多个线程调用一个构建器时,如何维护由buildParts()创建的状态?我认为构建器不应该是单体的 如果你真的想,我想你可以这样做: public final class Builder{ private static final Builder instance = new Builder(); private Part part1= null;

我遇到了几个关于作为单例实现的构建器模式的引用:

摘自:“抽象工厂、构建器和原型可以在其实现中使用单例”


构建器模式如何实现单例?当多个线程调用一个构建器时,如何维护由
buildParts()
创建的状态?我认为构建器不应该是单体的

如果你真的想,我想你可以这样做:

public final class Builder{
    private static final Builder instance = new Builder();

    private Part part1= null;

    private Part part2= null;
    ...

    public static Builder getInstance() { 
         return instance;
    }

    private Builder() { /*singleton  */ }

    public Builder buildPart1(Part p){
        part1 = p;
        return this;
    }
    ...build other parts similar;

    Product getResult(){
        return new ConcreteProduct(part1, part2 ...);
    }
}
但是,通过重新使用同一个单例实例,您必须确保正确设置了所有值,并且不会意外地重新使用以前构建的产品中的旧值


即使进行了适当的同步,我认为从其他线程/以前构建的生产值泄漏到您的产品中可能出现的bug和意外情况也不值得这么做。

我认为构建器不应该是单例的

如果你真的想,我想你可以这样做:

public final class Builder{
    private static final Builder instance = new Builder();

    private Part part1= null;

    private Part part2= null;
    ...

    public static Builder getInstance() { 
         return instance;
    }

    private Builder() { /*singleton  */ }

    public Builder buildPart1(Part p){
        part1 = p;
        return this;
    }
    ...build other parts similar;

    Product getResult(){
        return new ConcreteProduct(part1, part2 ...);
    }
}
但是,通过重新使用同一个单例实例,您必须确保正确设置了所有值,并且不会意外地重新使用以前构建的产品中的旧值


即使进行了适当的同步,我认为从其他线程/以前构建的生产值泄漏到您的产品中可能出现的bug和意外情况也不值得这么做。

我同意,我认为不应该是单例。此外,我想不出一种方法来实现它,并且仍然是安全的。我同意,我不认为它应该是单例的。此外,我想不出一个方法来实现它,但仍然是安全的。