Java 디자인의 빌더 패턴 소개

亚连
풀어 주다: 2018-05-26 16:09:52
원래의
1459명이 탐색했습니다.

본 글에서는 Person 예제를 통해 겹치는 생성자 패턴 분석과 Builder 패턴의 사용 시나리오를 주로 소개하고, 겹치는 생성자 패턴의 단점을 보완하기 위해 JavaBeans 패턴을 사용하는 방법을 소개합니다

개요

빌더 패턴: 복잡한 객체 변환 객체의 구성은 표현과 분리되어 동일한 구성 프로세스로 다양한 표현을 만들 수 있습니다.

사용 시나리오

  • 동일한 방법, 다른 실행 순서, 다른 이벤트 결과 생성

  • 여러 구성 요소 또는 부품을 하나의 개체로 조립할 수 있지만 결과 실행 결과가 다른 경우

  • 제품 클래스가 매우 복잡하거나 제품 클래스의 호출 순서가 다른 효과를 가집니다

  • 객체 초기화가 매개변수가 많고 매개변수가 기본값을 갖는 등 특히 복잡할 때

The 다음은 Person 예제를 사용하여 겹치는 생성자 패턴, JavaBeans 패턴 및 Builder 패턴의 사용을 분석합니다. Person 클래스에는 두 개의 필수 매개변수(id 및 이름)와 5개의 선택적 매개변수(나이, 성별, 전화번호, 주소 및 설명)가 있습니다.

겹치는 생성자 모드

이 모드에서는 첫 번째 생성자가 필수 매개변수만 제공합니다. 매개 변수가 있는 경우 두 번째 생성자에는 하나의 선택적 매개 변수가 있고 세 번째 생성자에는 두 개의 선택적 매개 변수가 있는 식으로 마지막 생성자에 모든 선택적 매개 변수가 포함될 때까지 계속됩니다. 프로그래밍 구현을 살펴보겠습니다.

/ * 使用重叠构造器模式
 */
public class Person {
 //必要参数
 private final int id;
 private final String name;
 //可选参数
 private final int age;
 private final String sex;
 private final String phone;
 private final String address;
 private final 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, "李四", 20, "男", "18800000000", "China", "测试使用重叠构造器模式");
로그인 후 복사

생성자가 겹치는 것은 가능하지만 매개변수가 많으면 생성 및 사용 코드를 작성하고 읽기가 어렵습니다

JavaBeans 패턴

Javabean 작성 방법을 채택하여 잔뜩 작성합니다. of 속성의 setter 메서드는 객체를 생성한 다음 setter 메서드를 호출하여 속성에 값을 할당합니다.

/ * 使用JavaBeans模式
 */
public class Person {
 //必要参数
 private int id;
 private String name;
 //可选参数
 private int age;
 private String sex;
 private String phone;
 private String address;
 private String desc;
 public void setId(int id) {
 this.id = id;
 }
 public void setName(String name) {
 this.name = name;
 }
 public void setAge(int age) {
 this.age = age;
 }
 public void setSex(String sex) {
 this.sex = sex;
 }
 public void setPhone(String phone) {
 this.phone = phone;
 }
 public void setAddress(String address) {
 this.address = address;
 }
 public void setDesc(String desc) {
 this.desc = desc;
 }
로그인 후 복사


이 패턴은 겹치는 생성자 패턴의 단점을 보완합니다. 인스턴스 생성은 쉽고 결과 코드는 읽기 쉽습니다.

Person person = new Person();
person.setId(1);
person.setName("李四");
person.setAge(20);
person.setSex("男");
person.setPhone("18800000000");
person.setAddress("China");
person.setDesc("测试使用JavaBeans模式");
로그인 후 복사


JavaBeans 패턴 구성 프로세스가 여러 호출로 나누어지기 때문에 JavaBeans는 구성 프로세스 중에 일관성 없는 상태에 있을 수 있습니다. 클래스는 단순히 생성자 매개변수의 유효성을 확인하는 것만으로는 일관성을 보장할 수 없습니다.

빌더 패턴

빌더 패턴은 생성자가 겹치는 등 안전성을 보장할 수 있을 뿐만 아니라 JavaBean 패턴과 같은 가독성도 얻을 수 있습니다.

/**
 * 使用Builder模式
 */
public class Person {
 //必要参数
 private final int id;
 private final String name;
 //可选参数
 private final int age;
 private final String sex;
 private final String phone;
 private final String address;
 private final 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);
 }
 }
}
로그인 후 복사

Person은 변경할 수 없으며 모든 기본 매개변수 값은 별도의 위치에 배치됩니다. 빌더의 setter 메소드는 빌더 자체를 반환하므로 체인에서 호출될 수 있습니다. 다음은 클라이언트 사용 코드입니다.

Person person = new Person.Builder(1, "Zhang San")
       .age(18).sex("Male").desc("Test using builder mode").build ( );

Android 소스 코드의 빌더 모드

  • AlertDialog 소스 코드

  • Universal-Image-Loader 그림 라이브러리

  • OkHttp 소스 코드 요청

장점:

  • 빌더 패턴을 사용하면 좋은 캡슐화가 가능하므로 클라이언트가 제품 내부 구성의 세부 사항을 알 수 없습니다.

  • 빌더는 독립적이고 확장하기 쉽습니다(추상화 가능 - 인터페이스, 추상 클래스)

단점:

  • 중복된 Builder 개체와 Director 개체를 생성하여 메모리를 소비합니다.

요약: Builder 패턴은 일반적으로 구성 클래스와 프리젠테이션을 분리하는 구성 클래스의 빌더로 사용됩니다. 또한 대상 클래스에서 구성을 분리하고 너무 많은 setter 메소드를 방지합니다.

위 내용을 정리했습니다. 앞으로 도움이 되길 바랍니다.

관련 기사:

Ajax 액세스를 사용할 때마다 IE8을 새로 고칠 수 없는 문제

IE8/IE9에서의 Ajax 캐시 문제

IE8에서의 Ajax 캐시 문제 및 해결 방법

위 내용은 Java 디자인의 빌더 패턴 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿