今回はビルダーモードの使い方と、ビルダーモードを使用する際の注意点を紹介します。実際の事例を見てみましょう。
概要
ビルダーパターン: 複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします。
使用シナリオ
同じメソッド、異なる実行順序では、異なるイベント結果が生成されます
複数のコンポーネントまたはパーツを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 ソース コードをリクエスト
利点:
優れたカプセル化、Builder Patternを使用すると、クライアントは製品の内部構成の詳細を知ることができなくなります
Builderは独立しており、拡張が簡単です(抽象化 - インターフェース、Abstractクラスを介して行うことができます) )
短所:
は冗長なBuilderオブジェクトとDirectorオブジェクトを生成し、メモリを消費します
概要: Builder パターンは通常、設定の構築と表示を分離するための設定クラスのビルダーとして使用され、設定が多すぎることを避けるためにターゲット クラスから分離されます。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
以上がビルダーモードの使用方法にはどのようなものがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。