ビルダーモードの使い方

php中世界最好的语言
php中世界最好的语言オリジナル
2018-06-14 11:41:251335ブラウズ

今回はビルダーモードの使い方と、ビルダーモードを使用する際の注意点を紹介します。以下は実際のケースですので見てみましょう。

概要

ビルダーパターン: 複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします。

使用シナリオ

  • 同じメソッド、異なる実行順序では、異なるイベント結果が生成されます

  • 複数のコンポーネントまたはパーツを1つのオブジェクトに組み立てることができますが、結果として生じる実行結果は異なります。

  • プロダクトクラスが非常に複雑であるか、プロダクトクラスの呼び出しシーケンスが異なる影響を及ぼします

  • 多くのパラメーターがあり、多くのパラメーターにデフォルト値があるなど、オブジェクトの初期化が特に複雑な場合

以下では、Person の例を使用して、重複するコンストラクター パターン、JavaBeans パターン、および Builder パターンの使用を分析します。 Person クラスには 2 つの必須パラメーター (id と名前) と 5 つのオプションのパラメーター (年齢、性別、電話番号、住所、説明) があります

重複するコンストラクター モード

このモードでは、最初のコンストラクターは必須のパラメーターのみを提供します最後のコンストラクターにすべてのオプションのパラメーターが含まれるまで、2 番目のコンストラクターには 1 つのオプションのパラメーターが含まれ、3 番目のコンストラクターには 2 つのオプションのパラメーターが含まれます。プログラミング実装を見てみましょう:

/ * 使用重叠构造器模式
 */
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 パターン 構築プロセスが複数の呼び出しに分割されるため、JavaBeans は構築プロセス中に一貫性のない状態になる可能性があります。クラスは、コンストラクターのパラメーターの有効性をチェックするだけでは一貫性を保証できません。

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 は不変であり、すべてのデフォルトのパラメーター値は別の場所に配置されます。ビルダーの 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 ソース コードをリクエスト

読んでいただいたと思いますこの記事のケース この方法をマスターしたら、よりエキサイティングなコンテンツについては、php 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

Angular CLI によるルーティングの動作

Angularjs のコントローラーの相互通信機能の詳細な説明

以上がビルダーモードの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。