디자인 모드 의 건설 자 모드(변종 Builder 모드)
최근 프로젝트 에 HTTP 네트워크 요청 프레임 워 크 인 OKHttp 를 사 용 했 습 니 다.사용 과정 에서 재 미 있 는 코드 를 발견 하면 다음 과 같다.
HttpUrl url = new HttpUrl.Builder()
.scheme("http")
.host(host)
.port(port)
.encodedPath(uri)
.build();
이러한 체인 호출 은 우리 의 코드 를 더욱 간결 하고 이해 하기 쉬 워 보일 수 있 습 니 다.이 코드 는 최종 적 으로 build 를 통 해 HttpUrl 대상 을 만 드 는 것 입 니 다.유사 한 것 은 우리 가 Gson 을 사용 하여 대상 을 json 으로 바 꿀 때 대상 속성 이 null 일 수 있 을 때 우리 도 전환 해 야 합 니 다.Gson 실례 화 는 다음 과 같 습 니 다.
Gson gson = new GsonBuilder()
.serializeNulls()
.create();
위의 두 가지 생 성 대상 의 쓰기 방법 은 모두 builder 모드 를 사용 하고 있 습 니 다.오늘 은 자세히 알 아 보 겠 습 니 다.
빌 더 모드:
기본 소개
건설 자 모델 의 정 의 는 복잡 한 대상 의 구축 과 그 표 시 를 분리 시 켜 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 도록 하 는 것 이다.
건설 자 모드 는 모두 4 개의 캐릭터 가 있 습 니 다.
1.추상 적 인 건축 자(Builder)역할:이 역할 은 제품 의 각 구성 부분 을 규범화 시 키 고 추상 적 이 며 응용 프로그램의 논리 에 독립 된다.
2.구체 적 인 건설 자(Concrete Builder)역할:이 역할 은 추상 적 인 건설 자 에서 정 의 된 모든 방법 을 실현 하고 구 성 된 제품 인 스 턴 스 를 되 돌려 줍 니 다.
3.제품(Product)역할:이 역할 은 건축 자 중의 복잡 한 대상 으로 한 시스템 에 한 가지 이상 의 제품 류 가 있 을 수 있다.이런 제품 류 는 반드시 공 통 된 인터페이스 가 있 는 것 이 아니 라 전혀 관련 이 없 을 수 있다.
4.감독자(Director)역할:이 역할 은 기 존 모듈 의 순 서 를 배정 한 다음 에 Builder 에 게 건설 을 시작 하 라 고 알려 준다.
buidler 모드 의 중점 은 대상,즉 new 대상 을 만 드 는 데 있 습 니 다.
2.흔히 볼 수 있 는 두 가지 구축 방식
1.다시 불 러 오 는 구조 함 수 는 먼저 예 를 들 어 다음 과 같다.수 요 는 다음 과 같다.현재 Person 류 가 있 고 name,age,location,job 속성 이 있다.이 몇 개의 속성 은 name 만 필요 하고 나머지 는 선택 할 수 있 습 니 다.ok,우리 먼저 정상 적 인 논리 코드 를 만 듭 시다.
/**
* @author cj34920
* Date: 2018/07/10
*/
public class Person {
private final String name;
private int age;
private String location;
private String job;
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, String location) {
this.name = name;
this.age = age;
this.location = location;
}
public Person(String name, int age, String location, String job) {
this.name = name;
this.age = age;
this.location = location;
this.job = job;
}
}
이런 방식:간단 해!정말 간단 합 니 다.어떤 매개 변수 구조 함 수 를 원 하 는 지 한눈 에 알 수 있 습 니 다.그러나 호출 자로 서 그 는 new 대상 과 동시에 모든 구조 함 수 를 알 아야 한다.그렇지 않 으 면 실수 로 순 서 를 잘못 채 우 는 것 이 어색 하지 않 겠 는가?그리고 이것 은 네 개의 매개 변수 만 있 는데 10 개가 있 으 면 어떻게 합 니까?10 개의 구조 함수 가 필요 합 니까?단점 도 명확 하 다.매개 변수 가 많 으 면 적용 되 지 않 고 유지 하기 어렵다.
2.setter 방법 구조:
/**
* @author cj34920
* Date: 2018/07/10
*/
public class Person {
private String name;
private int age;
private String location;
private String job;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
이런 방식 도 흔히 볼 수 있 는 구조 방식 이다.이런 방식 은 조금 좋 고 이해 하기 쉽다.예 를 들 어 setName 은 name 에 값 을 부여 하 는 것 이다.그러나 단점 도 분명 하 다.1 매개 변수 변 수 는 final 이 아니다.2.대상 상태 가 연속 되 지 않 습 니 다.4 번 setter 후에 야 완전한 상 태 를 가 져 올 수 있 습 니 다.3.코드 양 이 많은 편 입 니 다.같은 문제 의 10 개 속성,나 는 set XXX 를 10 여 번 호출 해 야 한다.
사용자 가 불완전한 대상 을 가 져 올 수 있 습 니 다.
여기 서 불완전한 상태의 대상 이 무엇 인지 설명 합 니 다.여기 서 대상 을 만 드 는 것 은 분명히 2 단계 입 니 다.1.대상 을 만 드 는 것,2.할당 입 니 다.이런 방식 으로 대상 을 만 들 면 두 번 째 값 을 부여 할 때 대상 을 되 돌 릴 수 있 습 니 다.그러면 만 든 대상 은 불완전한 대상 입 니 다.
3.Builder 모드 는 어떻게 호출 합 니까?
/**
* @author cj34920
* Date: 2018/07/09
*/
public class Person {
private final String name;
private int age;
private String location;
private String job;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getLocation() {
return location;
}
public String getJob() {
return job;
}
Person(PersonBuilder personBuilder) {
this.name = personBuilder.name;
this.location = personBuilder.location;
this.job = personBuilder.job;
this.age = personBuilder.age;
}
public static class PersonBuilder {
final String name;
int age;
String location;
String job;
PersonBuilder(String userName) {
this.name = userName;
}
public PersonBuilder age(int age) {
this.age = age;
return this;
}
public PersonBuilder location(String location) {
this.location = location;
return this;
}
public PersonBuilder job(String job) {
this.job = job;
return this;
}
public Person builder() {
return new Person(this);
}
}
}
호출 방법:
Person person = new Person.PersonBuilder("cj")
.age(24)
.job("java")
.location(" ")
.builder();
변종 builder 모드 는 다음 과 같은 내용 을 포함 합 니 다.
4.567917.1 정적 내부 류,정적 내부 류 의 매개 변 수 는 구축 류 와 같다
4.567917.2 외부 류 는 get 방법 만 제공 하여 보기 편 하고 정적 내부 류 는 set 방법 을 제공 하 며 할당 작업 을 제공 합 니 다
4.567917.3 정적 내부 클래스 가 제공 하 는 setter 작업,반환 값 은 현재 Builder 자체 입 니 다
4.567917.4 외부 류 의 구조 적 인 파 라 메 터 는 정적 내부 류 이 고 정적 내부 류 의 변 수 를 사용 하여 외부 류 에 할당 합 니 다
최종 적 으로 builder 를 외부 클래스 로 되 돌려 줍 니 다이런 builder 모드 는 전통 적 인 builder 모드 와 확실히 다르다.그러나 사실은 본질 이 똑 같 습 니 다.우 리 는 일일이 대응 할 수 있 습 니 다.
4.567917.제품(Product)역할:즉,하나의 종 류 를 만 들 고 구성원 변 수 를 설명 하 며 person 류 와 비슷 합 니 다
4.567917.추상 적 인 건축 자 역할:정태 적 인 내부 류 에 해당 하고 제품 정의 의 속성 을 정태 적 인 내부 류 에 복사 하 는 동시에 set 방법 을 생 성 한다
4.567917.구체 적 인 건설 자:즉,외부 류 가 제공 하 는 구조 함수 로 정적 내부 류 의 변수 값 을 외부 류 에 할당 합 니 다
감독 역할:정적 내부 클래스 의 builder 방법
장점:단정 해 보인다.먼저 값 을 부여 한 후 대상 을 만 듭 니 다.단점:추가 코드 를 작성 해 야 합 니 다.
요약:
사실 많은 디자인 모델 이 일반 코드 에서 응용 되 지만 우 리 는 가끔 그들 을 무시 하 는 것 을 선택한다.공부 하 는 과정 에서 우 리 는 100%호기심 으로 왜 이러 는 지 배 워 야 한다.너 는 반드시 다른 발견 을 할 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.