자바 개발 중의 23 가지 디자인 모델 에 대한 상세 한 설명 - 빌 더 모델 (Builder)
7741 단어 디자인 모드
머리말
일상적인 개발 에서 우 리 는 다음 과 같은 코드 를 자주 볼 수 있 습 니 다.
PrivateKeyDecryptParam param = new PrivateKeyDecryptParam.Builder()
.uAppId(uAppId)
.containerId(containerId)
.cipher(cipher)
.signFlag(signFlag)
.build();
Android 에서 도 아래 에 AlertDialog 코드 를 만 드 는 것 을 볼 수 있 습 니 다.
new AlertDialog.Builder(this)
.setTitle(" ")
.setMessage(" ")
.setCancelable(true)
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
})
.show();
위의 두 단락 의 코드 를 관찰 하면 모두 하나의 공 통 된 특징 이 있 는데 그것 이 바로 체인 조작 을 할 수 있다 는 것 이다. 이것 이 바로 우리 가 배 워 야 할 Builder 모델 이다. 다음은 상세 하 게 배 워 보 자.
2. Builer 모드 의 사용 장면
'Effective Java 2 판' 책 에 서 는 여러 구조 체 파 라 메 터 를 만 났 을 때 빌 더 (Builder 모드) 사용 을 고려 해 야 한다 고 언급 했다.
예 를 들 어 프로젝트 에서 저 희 는 Person 류 를 새로 만들어 야 합 니 다. 이 클래스 에 7 개의 속성 (현실 에서 이 몇 개의 매개 변수 만 있 는 것 이 아니 라) 이 있다 고 가정 하면 그 중에서 2 개 는 필요 한 매개 변 수 를 초기 화 해 야 합 니 다. 각각 id 와 name 입 니 다.
1. 자바 빈 의 setter 방법 으로 대상 속성 설정
가장 흔히 볼 수 있 는 표기 법 은 자바 빈 이 라 고 쓰 는 것 이다.코드 는 다음 과 같 습 니 다:
public class Person {
//
private int id;
private String name;
//
private int age;
private String sex;
private String phone;
private String address;
private String desc;
// set/get
}
이 Person 클래스 를 사용 할 때 다음 코드 를 씁 니 다.
Person person = new Person();
person.setId(1);
person.setName(" ");
person.setAge(22);
person.setSex(" ");
person.setPhone("19999999999");
person.setAddress("beijing");
person.setDesc("JavaBeans ");
이런 자바 빈 의 방식 도 흔히 볼 수 있 는 구조 대상 과 값 을 부여 하 는 방식 이다. 이런 방식 의 장점 은:
(1) 읽 기 쉽 고 유용 한 구성원 변수 에 만 값 을 부여 할 수 있 습 니 다.
그러나 단점 은:
(1) 구성원 변 수 는 final 유형 이 되 어 서 는 안 되 고 변 하지 않 는 대상 의 많은 장점 을 잃 었 다.
(2) 대상 상태 가 연속 되 지 않 습 니 다. 7 번 setter 방법 을 사용 해 야 7 개의 속성 을 가 진 변 수 를 얻 을 수 있 습 니 다. 이 기간 에 사용 자 는 불완전한 상 태 를 가 진 대상 을 얻 을 수 있 습 니 다.N 개의 속성 이 있다 면 person. setXXX 에서 N 번 을 호출 하 는 것 이 아 닙 니까?이런 방식 은 우아 하지 않다.
가장 중요 한 단점 은 두 번 째: 대상 상태 가 연속 되 지 않 는 다 는 것 이다.무슨 뜻 이 죠?
설명: 이런 방식 은 먼저 대상 을 만 들 고 나중에 값 을 부여 하 는 것 입 니 다. 사용 자 는 언제 대상 을 받 았 는 지 모 르 고 구축 이 완료 되 었 습 니 다.setter 가 한두 개의 속성 만 가지 고 되 돌 아 왔 을 가능성 이 높 습 니 다. 필요 한 속성 은 할당 되 지 않 았 습 니 다.
2. 중첩 구조 기 사용
이런 모델 에서 필요 한 매개 변수 만 있 는 구조 기 를 제공 해 야 한다. 두 번 째 구조 기 는 선택 할 수 있 는 매개 변수 가 있 고 세 번 째 는 선택 할 수 있 는 매개 변수 가 두 개 있다. 이런 추측 에 의 하면 마지막 구조 기 는 모든 선택 할 수 있 는 매개 변 수 를 포함한다.코드 는 다음 과 같 습 니 다:
public class Person {
//
private final int id;
private final String name;
//
private int age;
private String sex;
private String phone;
private String address;
private String desc;
public Person(int id, String name) {
this(id, name, 0);
}
public Person(int id, String name, int age) {
this(id, name, age, "");
}
public Person(int id, String name, int age, String sex) {
this(id, name, age, sex, "");
}
public Person(int id, String name, int age, String sex, String phone) {
this(id, name, age, sex, phone, "");
}
public Person(int id, String name, int age, String sex, String phone,
String address) {
this(id, name, age, sex, phone, address, "");
}
public Person(int id, String name, int age, String sex, String phone,
String address, String desc) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.phone = phone;
this.address = address;
this.desc = desc;
}
}
위의 코드 를 통 해 알 수 있 듯 이 인 스 턴 스 를 만 들 려 면 매개 변수 목록 의 가장 짧 은 구조 기 를 이용 하 십시오. 그러나 이 목록 에는 설정 할 모든 매개 변수 가 포함 되 어 있 고 나머지 는 기본 값 입 니 다.
Person person = new Persion(1, " ");
이 구조 기 는 보통 설정 하고 싶 지 않 은 인자 가 많이 필요 하지만 값 을 전달 해 야 합 니 다.
이런 방식 의 장점 은 간단 하 다!!!(이것 은 개발 자 에 게) 그러나 사용자 가 사용 할 때 모든 구조 함 수 를 자세히 알 아야 합 니 다. 그렇지 않 으 면 실수 로 순 서 를 잘못 채 워 도 모 릅 니 다.그리고 만약 에 십 여 개의 속성 이 있다 면 요 리 를 쉬 었 을 것 이다.
그래서 단점 은:
구성원 변수 가 적은 경우 에 만 적 용 됩 니 다. 너무 많아 서 이해 하고 유지 하기 가 쉽 지 않 습 니 다.
쉽게 말 하면 중첩 구조 기 는 가능 하지만 많은 매개 변수 가 있 을 때 사용 코드 를 만 드 는 것 은 쓰기 어렵 고 읽 기 어렵다.
3. 변종 Builder 모드
상기 분석의 두 가지 방법 은 모두 장점 과 단점 이 존재 한다. 상기 두 가지 구축 방식 의 부족 을 해결 하기 위해 위대 한 프로그래머 들 은 변종 Builder 모델 을 만 들 었 다.코드 직접 보기:
public class Person {
//
private final int id;
private final String name;
//
private int age;
private String sex;
private String phone;
private String address;
private String desc;
private Person(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
this.sex = builder.sex;
this.phone = builder.phone;
this.address = builder.address;
this.desc = builder.desc;
}
public static class Builder {
//
private final int id;
private final String name;
//
private int age;
private String sex;
private String phone;
private String address;
private String desc;
public Builder(int id, String name) {
this.id = id;
this.name = name;
}
public Builder age(int val) {
this.age = val;
return this;
}
public Builder sex(String val) {
this.sex = val;
return this;
}
public Builder phone(String val) {
this.phone = val;
return this;
}
public Builder address(String val) {
this.address = val;
return this;
}
public Builder desc(String val) {
this.desc = val;
return this;
}
public Person build() {
return new Person(this);
}
}
}
위 코드 를 살 펴 보면 변종 Builder 모드 는 다음 과 같은 내용 을 포함 합 니 다.
(1) 클래스 를 구축 할 내부 에 정적 내부 클래스 Builder 를 만 듭 니 다.
(2) 정적 내부 류 의 속성 은 구축 류 의 속성 과 일치 해 야 한다.
(3) 구축 류 의 구조 적 매개 변 수 는 정적 내부 류 이 고 정적 내부 류 의 변 수 를 구축 류 에 하나씩 할당 합 니 다.
(4) 정적 내부 클래스 에서 파 라 메 터 를 제공 하 는 setter 방법 이 고 반환 값 은 현재 Builder 대상 입 니 다.
(5) 최종 적 으로 build 방법 new 를 제공 하여 구축 류 의 대상 을 만 듭 니 다. 매개 변 수 는 현재 Builder 대상 입 니 다.
호출 코드 는 다음 과 같 습 니 다:
public class Test {
public static void main(String[] args) {
Person person = new Person.Builder(1, " ")
.age(22).sex(" ").desc(" builder ").build();
System.out.println(person.toString());
}
}
변종 Builer 모드 에 대한 요약:
(1) 변종 Builder 모델 은 대상 생 성 과정 에서 도 입 된 여러 구조 함수, 선택 가능 한 매개 변수 와 여러 setter 의 과도 한 사용 으로 인 한 불필요 한 복잡성 을 줄 이 는 데 목적 을 둔다.
(2) 장점 은 가지런 해 보 인 다 는 것 이다.먼저 값 을 부여 한 다음 에 대상 을 만 들 고 최종 적 으로 build () 방법 을 호출 하여 구축 류 의 대상 을 만 들 고 상태의 완전 성 을 확보 합 니 다.
(3) 단점 은 추가 로 써 야 할 코드 가 많다 는 것 이다.
4. 소결:
변종 버 일 러 모드 는 중첩 구조 기 모드 와 자바 빈 스 모드 보다 빌 더 모드 가 구현 되 는 대상 이 사용 하기에 유리 하 다.
Builer 모드 사용 방법 에 대한 정리:
(1) 외부 류 의 구조 함수 가 사유 하고 매개 변 수 는 정적 내부 류 이다.(2) 정적 내부 류 는 외부 류 와 같은 속 을 가진다.(3). 모든 속성 에 방법 을 쓰 고 Builer 를 되 돌려 줍 니 다.(4) 마지막 방법 은 build 방법 으로 외부 클래스 를 구축 하 는 데 사 용 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.