자바 빌 더 모델 실현 원리 및 장단 점 분석

Builder 모드 에서 중국 어 는 건축 자 모드 라 고도 부 르 고 생 성기 모드 라 고도 부 릅 니 다.대상 생 성 모델 에 속 하 며 복잡 한 대상 의 구축 과 그 표현 을 분리 시 켜 같은 구축 과정 에서 서로 다른 표현 을 만 들 수 있 습 니 다.건설 자 모델 은 한 걸음 한 걸음 복잡 한 대상 을 만 드 는 것 으로 사용자 가 복잡 한 대상 의 유형 과 내용 만 지정 하면 구축 할 수 있 고 사용 자 는 내부 의 구체 적 인 구축 세부 사항 을 알 필요 가 없다.다음 그림 은 건설 자 모드 의 일반적인 도표 입 니 다.

건설 자 모델 에서 다음 과 같은 네 가지 역할 이 있다.
Product:제품 캐릭터Builder:추상 적 인 건축 자,제품 인터페이스 정의
  • ConcreteBuilder:구체 적 인 건축 자,Builder 정의 인 터 페 이 스 를 실현 하고 조립 된 제품 으로 돌아 갑 니 다
  • 4.567917.Director:지휘자,이 안에 있 는 맏형 입 니 다.어떤 제품 을 생산 해 야 하 는 지 직접 찾 으 세 요건설 자 모델 응용 예
    홈 웨 어
    홈 웨 어 는 양장 이 든 간 장 이 든 절차 가 상대 적 으로 고정 되 어 있 기 때문에 건설 자 모델 에 적용 된다.우 리 는 가정 복 을 예 로 들 어 건축 자 모델 을 알 아 보 는 것 을 배 웠 다.다음 그림 은 홈 메 이 크 업 모델 이 간단 한 UML 그림 입 니 다.

    1.홈 웨 어 대상 클래스
    
    /**
     *      
     */
    public class House {
      //    
      private String jiadian;
    
      //    
      private String diban;
      //    
      private String youqi;
    
      public String getJiadian() {
        return jiadian;
      }
    
      public void setJiadian(String jiadian) {
        this.jiadian = jiadian;
      }
    
      public String getDiban() {
        return diban;
      }
    
      public void setDiban(String diban) {
        this.diban = diban;
      }
    
      public String getYouqi() {
        return youqi;
      }
    
      public void setYouqi(String youqi) {
        this.youqi = youqi;
      }
    
      @Override
      public String toString() {
        return "House{" +
            "jiadian='" + jiadian + '\'' +
            ", diban='" + diban + '\'' +
            ", youqi='" + youqi + '\'' +
            '}';
      }
    }
    2.추상 적 인 건축 자 Builder 류
    
    /**
     *      
     */
    public interface HouseBuilder {
      //    
      void doJiadian();
      //    
      void doDiBan();
      //    
      void doYouqi();
    
      House getHouse();
    }
    3.구체 적 인 건축 자-간이 포장 건축 자 류
    
    /**
     *      
     */
    public class JianzhuangBuilder implements HouseBuilder {
    
      private House house = new House();
    
      @Override
      public void doJiadian() {
        house.setJiadian("      ");
      }
    
      @Override
      public void doDiBan() {
        house.setDiban("    ");
      }
    
      @Override
      public void doYouqi() {
        house.setYouqi("         ");
      }
    
      @Override
      public House getHouse() {
        return house;
      }
    }
    4.구체 적 인 건축 자-양장 건축 자 류
    
    /**
     *      
     */
    public class jingzhuangBuilder implements HouseBuilder {
    
      private House house = new House();
    
      @Override
      public void doJiadian() {
        house.setJiadian("    ,   ");
      }
    
      @Override
      public void doDiBan() {
        house.setDiban("    ,    ");
      }
    
      @Override
      public void doYouqi() {
        house.setYouqi("    ,   0   ");
      }
    
      @Override
      public House getHouse() {
        return house;
      }
    }
    5.지휘관-홈 웨 어 회사 류
    
    /**
     *     ,            
     */
    public class HouseDirector {
    
      public House builder(HouseBuilder houseBuilder){
        houseBuilder.doDiBan();
        houseBuilder.doJiadian();
        houseBuilder.doYouqi();
        return houseBuilder.getHouse();
      }
    }
    6.테스트
    
    public class App {
      public static void main(String[] args) {
        house();
      }
    
      public static void house(){
        HouseDirector houseDirector = new HouseDirector();
        //   
        JianzhuangBuilder jianzhuangBuilder = new JianzhuangBuilder();
        System.out.println("    ");
        System.out.println(houseDirector.builder(jianzhuangBuilder));
    
        //   
        jingzhuangBuilder jingzhuangBuilder = new jingzhuangBuilder();
        System.out.println("    ");
        System.out.println(houseDirector.builder(jingzhuangBuilder));
    
      }
    }
    출력 결과

    우 리 는 가정 복 을 예 로 들 어 두 개의 구체 적 인 건축 자,한 개의 간단 한 건축 자,한 개의 양장 건축 자 를 실현 했다.우 리 는 단지 가정 복 회사 에 내 가 간단 한 옷 이 필요 한 지,아니면 양장 이 필요 한 지 알려 줄 필요 가 있다.그 는 우 리 를 도와 안배 할 것 이다.나 는 안의 구체 적 인 세부 사항 을 알 필요 가 없다.어 때?건설 자 모델 배 웠 어?
    대상 구축
    일상적인 개발 에서 당신 은 아래 의 코드 를 자주 볼 수 있 습 니까?
    
    return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.curry.springbootswagger.controller"))
        .paths(PathSelectors.any())
        .build();
    너무 아름 답지 않 아 요?Builder 모드 를 배 운 후에 도 이런 방식 으로 대상 구축 을 할 수 있 습 니 다.그것 은 변종 Builder 모드 를 통 해 이 루어 졌 다.먼저 설명 하지 않 겠 습 니 다.우 리 는 먼저 Builder 모델 로 상기 대상 과 의 구축 을 실현 하고 학생 류 를 예 로 들 겠 습 니 다.
    학생 대상 코드:
    
    public class Student {
    
      private String name;
    
      private int age;
    
      private int num;
    
      private String email;
    
      //       builder  
      public static Student.Builder builder() {
        return new Student.Builder();
      }
      //     builder          。
      public static class Builder{
        private String name;
    
        private int age;
    
        private int num;
    
        private String email;
    
        public Builder name(String name) {
          this.name = name;
          return this;
        }
    
        public Builder age(int age) {
          this.age = age;
          return this;
        }
    
        public Builder num(int num) {
          this.num = num;
          return this;
        }
    
        public Builder email(String email) {
          this.email = email;
          return this;
        }
    
        public Student build() {
          //  builder           
          return new Student(this);
        }
      }
      //       
      private Student(Builder builder) {
        name = builder.name;
        age = builder.age;
        num = builder.num;
        email = builder.email;
      }
    
      @Override
      public String toString() {
        return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", num=" + num +
            ", email='" + email + '\'' +
            '}';
      }
    }
    호출 코드:
    
      public static void student(){
        Student student = Student.builder().name("   ").num(1).age(18).email("   @163.com").build();
        System.out.println(student);
      }
    이 를 통 해 알 수 있 듯 이 변종 Builder 모드 는 다음 과 같은 내용 을 포함한다.
  • 구축 할 클래스 내부 에 정적 내부 클래스 Builder 를 만 듭 니 다
  • 4.567917.정태 내부 류 의 매개 변 수 는 구축 류 와 일치 합 니 다
  • 구축 류 의 구조 적 인 파 라 메 터 는 정태 내부 류 이 고 정태 내부 류 의 변 수 를 사용 하여 구축 류 에 일일이 할당 합 니 다
  • 정적 내부 클래스 에서 파 라 메 터 를 제공 하 는 setter 방법 이 고 반환 값 은 현재 Builder 대상 입 니 다
  • 최종 적 으로 build 방법 을 제공 하여 구축 류 의 대상 을 구축 합 니 다.매개 변 수 는 현재 Builder 대상 입 니 다
  • 아마도 당신 은 이런 쓰기 가 너무 번 거 로 워 서 우리 가 추가 코드 를 많이 써 야 한다 고 말 할 것 입 니 다.예 를 들 어 선배 들 이 lombok 을 개발 하여 우 리 를 구 할 수 있 습 니 다.우 리 는 lombok 플러그 인 을 도입 한 다음 에 실체 류 에@Builder 주 해 를 추가 하면 Builder 모델 로 대상 을 구축 할 수 있 습 니 다.
    건설 자 모델 의 장단 점
    장점.
    4.567917.건설 자 모델 에서 클 라 이언 트 는 제품 내부 로 구 성 된 세부 사항 을 알 필요 가 없고 제품 자체 와 제품 의 생 성 과정 을 결합 시 켜 같은 생 성 과정 에서 서로 다른 제품 대상 을 만 들 수 있다.
    4.567917.모든 구체 적 인 건축 자 는 상대 적 으로 독립 되 고 다른 구체 적 인 건축 자 와 무관 하기 때문에 구체 적 인 건축 자 를 편리 하 게 교체 하거나 새로운 구체 적 인 건축 자 를 추가 할 수 있다.사용자 가 서로 다른 구체 적 인 건축 자 를 사용 하면 서로 다른 제품 대상 을 얻 을 수 있다.
    4.567917.제품 의 생 성 과정 을 더욱 세밀 하 게 통제 할 수 있다.복잡 한 제품 의 생 성 절 차 를 서로 다른 방법 으로 분해 하여 생 성 과정 을 더욱 명확 하 게 하고 프로그램 을 사용 하여 생 성 과정 을 제어 하 는 데 편리 하 다.
    4.567917.새로운 구체 적 인 건설 자 를 추가 할 때 기 존의 라 이브 러 리 코드 를 수정 할 필요 가 없다.지휘자 류 는 추상 적 인 건설 자 류 에 대한 프로 그래 밍 으로 시스템 확장 이 편리 하고'개폐 원칙'에 부합된다결점.
    4.567917.건설 자 모델 이 만 든 제품 은 비교적 많은 공통점 을 가지 는데 그 구성 부분 이 비슷 하 다.만약 에 제품 간 의 차이 가 크 면 건설 자 모델 을 사용 하기에 적합 하지 않 기 때문에 그 사용 범 위 는 일정한 제한 을 받는다.
    4.567917.만약 에 제품 의 내부 변화 가 복잡 하면 구체 적 인 건축 자 류 를 정의 하여 이런 변 화 를 실현 해 야 하기 때문에 시스템 이 매우 커 질 수 있다이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기