자바 개발 중의 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 방법 으로 외부 클래스 를 구축 하 는 데 사 용 됩 니 다.

좋은 웹페이지 즐겨찾기