안 드 로 이 드 디자인 모드 - 빌 더 모드
그러나 이 정 의 를 보고 난 용 은 없 었 고 빌 더 디자인 모델 이 무엇 인지 몰 랐 다.이 개인의 태 도 는 디자인 모델 이라는 것 을 배 우 는 것 이다. 그 정의 에 지나치게 신경 쓰 지 마라. 정 의 는 흔히 추상 적 인 것 이다. 이 를 배 우 는 가장 좋 은 예 는 바로 샘플 코드 를 통 해 배 우 는 것 이다.
우 리 는 하나의 예 를 통 해 Builder 모드 를 끌 어 낸다.만약 에 Person 류 가 있다 고 가정 하면 우 리 는 이 Person 류 를 통 해 많은 사람 을 구축 할 수 있 습 니 다. 이 Person 류 에는 많은 속성 이 있 습 니 다. 가장 흔히 볼 수 있 는 것 은 name, age, weight, height 등 입 니 다. 그리고 우 리 는 이러한 값 이 설정 되 지 않도록 허용 합 니 다. 즉, null 로 허용 합 니 다. 이런 종류의 정 의 는 다음 과 같 습 니 다.
public class Person {
private String name;
private int age;
private double height;
private double weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
然后我们为了方便可能会定义一个构造方法。
public Person(String name, int age, double height, double weight) { this.name = name; this.age = age; this.height = height; this.weight = weight; }
或许为了方便new对象,你还会定义一个空的构造方法:
public Person() { }
甚至有时候你很懒,只想传部分参数,你还会定义如下类似的构造方法。
public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, double height) { this.name = name; this.age = age; this.height = height; }
于是你就可以这样创建各个需要的对象
Person p1=new Person(); Person p2=new Person(" "); Person p3=new Person(" ",18); Person p4=new Person(" ",21,180); Person p5=new Person(" ",17,170,65.4);
可以想象一下这样创建的坏处,最直观的就是四个参数的构造函数的最后面的两个参数到底是什么意思,可读性不怎么好,如果不点击看源码,鬼知道哪个是weight哪个是height。还有一个问题就是当有很多参数时,编写这个构造函数就会显得异常麻烦,这时候如果换一个角度,试试Builder模式,你会发现代码的可读性一下子就上去了。
我们给Person增加一个静态内部类Builder类,并修改Person类的构造函数,代码如下。
public class Person { private String name; private int age; private double height; private double weight; privatePerson(Builder builder){ this.name=builder.name; this.age=builder.age; this.height=builder.height; this.weight=builder.weight; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public double getHeight(){ return height; } public void setHeight(double height){ this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight){ this.weight = weight; } static class Builder{ private String name; private int age; private double height; private double weight; public Builder name(String name){ this.name=name; return this; } public Builder age(int age){ this.age=age; return this; } public Builder height(double height){ this.height=height; return this; } public Builder weight(double weight){ this.weight=weight; return this; } public Person build(){ return new Person(this); } } }
从上面的代码中我们可以看到,我们在Builder类里定义了一份与Person类一模一样的变量,通过一系列的成员函数进行设置属性值,但是返回值都是this,也就是都是Builder对象,最后提供了一个build函数用于创建Person对象,返回的是Person对象,对应的构造函数在Person类中进行定义,也就是构造函数的入参是Builder对象,然后依次对自己的成员变量进行赋值,对应的值都是Builder对象中的值。此外Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。
于是我们就可以这样创建Person类。
Person.Builder builder=new Person.Builder(); Person person=builder .name(" ") .age(18) .height(178.5) .weight(67.4) .build();
창설 과정 이 단번에 그렇게 뚜렷 해 졌 다 고 생각 하 십 니까?대응 하 는 값 이 어떤 속성 인지 한눈 에 알 수 있 고 가 독성 이 크게 증가 합 니 다.
마지막 으로 정리 해 주세요.
정적 내부 클래스 Builder 를 정의 합 니 다. 내부 의 구성원 변 수 는 외부 클래스 와 같 습 니 다 Builder 클래스 는 일련의 방법 을 통 해 구성원 변수의 할당 에 사용 되 고 현재 대상 자체 (this) 를 되 돌려 줍 니 다.
Builder 클래스 는 build 방법 이나 create 방법 을 제공 하여 대응 하 는 외부 클래스 를 만 드 는 데 사용 합 니 다. 이 방법 은 내부 에서 외부 클래스 의 개인 구조 함 수 를 호출 합 니 다. 이 구조 함수 의 매개 변 수 는 내부 클래스 Builder 입 니 다.
외부 클래스 는 내부 클래스 호출 을 위 한 개인 구조 함 수 를 제공 합 니 다. 이 구조 함수 에서 구성원 변수의 할당 을 완성 하고 Builder 대상 에 대응 하 는 값 을 추출 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.