디자인 모드 의 건설 자 모드(변종 Builder 모드)

11193 단어 자바디자인 모드
문제 발생 배경:
최근 프로젝트 에 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%호기심 으로 왜 이러 는 지 배 워 야 한다.너 는 반드시 다른 발견 을 할 것 이다.

좋은 웹페이지 즐겨찾기