Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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/6/codeigniter/3.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
我对java的构建器设计模式代码有点困惑_Java - Fatal编程技术网

我对java的构建器设计模式代码有点困惑

我对java的构建器设计模式代码有点困惑,java,Java,我只是想了解这行代码中发生了什么 Phone ph=new PhoneBuilder().setOs(“安卓”).setRam(“2”).get()以及该行的工作方式。为什么我们在“Phone ph”引用变量中分配两个对象,因为PhoneBuilder类方法返回其对象。对不起,我的英语不好 public class MakePhone { public static void main(String args[]){ Phone ph=new PhoneBuilder().

我只是想了解这行代码中发生了什么
Phone ph=new PhoneBuilder().setOs(“安卓”).setRam(“2”).get()以及该行的工作方式。为什么我们在“Phone ph”引用变量中分配两个对象,因为PhoneBuilder类方法返回其对象。对不起,我的英语不好

public class MakePhone {
    public static void main(String args[]){
       Phone ph=new PhoneBuilder().setOs("android").setRam("2").get();
       System.out.println(ph);

    }
}


public class Phone {
        String os,ram,storage,processor;


        public Phone(String os, String ram, String storage, String processor){
            this.os=os;
            this.ram=ram;
            this.storage=storage;
            this.processor=processor;
        }

    @Override
    public String toString() {
        return "Os"+os+",Ram"+ram+",Storage"+storage+"Processor"+"" ;
    }
}

public class PhoneBuilder {
    String os,ram,storage,processor;

    public PhoneBuilder setOs(String os) {
        this.os = os;
        return this;
    }

    public PhoneBuilder setRam(String ram) {
        this.ram = ram;
        return this;
    }

    public PhoneBuilder setStorage(String storage) {
        this.storage = storage;
        System.out.println(this);
        return this;
    }

    public PhoneBuilder setProcessor(String processor) {
        this.processor = processor;
        return this;
    }
    public Phone get(){
        return new Phone(os, ram, storage, processor);
    }
}

考虑到有问题的生成器代码行:

Phone ph = new PhoneBuilder()
    .setOs("android")         // sets the OS and returns a reference to the builder
    .setRam("2")              // sets the RAM and also returns a reference
    .get();                   // calls the constructor for a Phone
我们可以看到,构建器模式的工作原理是首先用所有我们想要创建
Phone
对象的属性填充
PhoneBuilder
POJO对象。我们通过方法链接以一种紧凑的方式来实现这一点,这是因为每个生成器setter方法都返回对同一生成器对象的引用。然后,在最后,我们调用
get()
,这将创建一个新的
Phone
实例


当Java类可能有许多不同类型的潜在构造函数时,构建器模式非常有用。与通过实际创建许多不同的构造函数来满足这一需求(这可能会成为维护的噩梦)不同,在builder模式中,理论上我们只需要一个构造函数调用。

以所讨论的builder代码行为例:

Phone ph = new PhoneBuilder()
    .setOs("android")         // sets the OS and returns a reference to the builder
    .setRam("2")              // sets the RAM and also returns a reference
    .get();                   // calls the constructor for a Phone
Phone ph=new PhoneBuilder()
.setOs(“android”)//设置操作系统并返回对生成器的引用
.setRam(“2”)//设置RAM并返回引用
.get();//给构造器打电话
它等于下面的代码:

PhoneBuilder=newphonebuilder()
builder.setOs(“安卓”)
建造商。setRam(“2”)
Phone ph=新电话(builder.os、builder.ram、builder.storage、builder.processor);
builder模式的优点是,所有设置phone值的过程都是一次性完成的,因此可以避免许多线程安全问题。

phone ph=new PhoneBuilder()
.setOs(“安卓”)
.setRam(“2”)
.get();
这段代码使用了一个构建器模式,它是“四人帮”设计模式之一

这是一种非常简洁的逐步构建复杂对象的方法,通常在需要使用相同的对象构建过程构建不同的不可变对象时使用

考虑以下问题,引用自:

想象一个复杂的物体,需要一步一步的努力 许多字段和嵌套对象的初始化。这种初始化 代码通常被隐藏在一个具有大量 参数。甚至更糟糕的是:散布在客户机代码中

构建器模式建议您将对象构造代码从其自己的类中提取出来,并将其移动到称为构建器的单独对象中

以问题中的代码为例,对象构造代码已从
Phone
类分离到
PhoneBuilder
类中

PhoneBuilder
类使用公共setter方法(即
setOs(String os)
setRam(String ram)
setStorage(String storage)
setProcessor(String processor)
)来设置手机的各种属性

每个setter通过
这个
指针返回相同的
电话
实例,因此可以进行方法链接,即:

Phone ph=new PhoneBuilder().setOs(“安卓”).setRam(“2”).get();
get()
方法初始化并返回一个带有生成器类属性的
Phone
实例。因此,它被称为链中的最后一个方法

您可以阅读有关生成器模式(和其他设计模式)的更多信息。 在模式上查找其他示例