首頁 >web前端 >js教程 >builder模式有哪些使用方法

builder模式有哪些使用方法

php中世界最好的语言
php中世界最好的语言原創
2018-05-03 15:29:151870瀏覽

這次帶給大家builder模式有哪些使用方法,builder模式使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

概述

Builder模式:將一個複雜物件的建構與它的表示分離,使得同樣的建構過程可以創建不同的表示。

使用場景

  • #相同的方法,不同的執行順序,產生不同的事件結果

  • 多個部件或零件,都可以組裝到一個物件中,但產生的運行結果又不相同時

  • 產品類別非常複雜,或者產品類別中的呼叫順序不同產生不同的作用

  • 當初始化一個物件特別複雜,如參數多,且許多參數都具有預設值時

#以下從一個Person範例進行分析重疊建構器模式、JavaBeans模式、Builder模式的使用。 Person類別有兩個必要參數(id和name),有5個可選參數(age,sex,phone,address和desc)

重疊建構子模式

在這個模式下,你提供第一個只有必要參數的建構器,第二個建構器有一個可選參數,第三個有兩個可選參數,依此類推,最後一個構造器包含所有的可選參數。下面看看其程式實作:

/ * 使用重叠构造器模式
 */
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 的寫法,寫一堆屬性的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模式因為建構過程被分到了幾個呼叫中,在建構過程中JavaBean可能處於不一致的狀態。類別無法僅透過檢驗構造器參數的有效性來保證一致性。

Builder模式

Builder模式既能保證像重疊建構器那樣的安全,也能實作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是不可變得,所有的預設參數值都單獨放在一個地方。 builder的setter方法傳回builder本身,以便可以鍊式呼叫。下面是客戶端使用程式碼:

Person person = new Person.Builder(1, "張三")
                .age(18).sex("男"). desc("測試使用builder模式").build();

Android原始碼中的Builder模式

  • #c AlertDialog原始碼
  • Universal-Image-Loader圖片庫

OkHttp的Request原始碼

良好的封裝性,使用建造者模式可以讓客戶端不比知道產品內部組成的細節

  • 建造者獨立,容易擴展(可透過抽象———接口,

    抽象類別###)###############缺點:## #############會產生多餘的Builder物件以及Director對象,消耗記憶體###

Summary: Builder pattern is usually used as a builder of configuration classes to separate the construction and presentation of configurations. , and also isolates the configuration from the target class to avoid too many setter methods.

# I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

Axios implementation of data interaction steps detailed explanation

Angular Component use case detailed explanation

以上是builder模式有哪些使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn