この記事では、主に、重複するコンストラクター パターンの分析、人の例からの Builder パターンの使用シナリオ、および重複するコンストラクター パターンの欠点を補うための JavaBeans パターンの使用について紹介します
概要
ビルダー パターン: 複雑なオブジェクトを変換する オブジェクトの構築がその表現から分離されているため、同じ構築プロセスで異なる表現を作成できます。
使用シナリオ
同じメソッド、異なる実行順序は、異なるイベント結果を生成します
複数のコンポーネントまたはパーツを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の書き方を採用して束ねて書く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 は構築プロセス中に一貫性のない状態になる可能性があります。クラスは、コンストラクターのパラメーターの有効性をチェックするだけでは一貫性を保証できません。
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 ( ;
利点:
欠点:
冗長な Builder オブジェクトと Director オブジェクトが生成され、メモリを消費します
上記は私が皆さんのためにまとめたもので、将来的に皆さんのお役に立てれば幸いです。
以上がJava 設計における Builder パターンの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。