Java 設計における Builder パターンの概要

亚连
リリース: 2018-05-26 16:09:52
オリジナル
1465 人が閲覧しました

この記事では、主に、重複するコンストラクター パターンの分析、人の例からの 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 オブジェクトが生成され、メモリを消費します

  • 概要:
  • Builder パターンは通常、として使用されます構成クラスのビルダーを使用して、構成の構築と表示を分離し、ターゲット クラスから構成を分離し、過剰なセッター メソッドを回避します。

上記は私が皆さんのためにまとめたもので、将来的に皆さんのお役に立てれば幸いです。
  • 関連記事:

  • AjaxアクセスでIE8が毎回更新できない問題

IE8/IE9でのAjaxキャッシュの問題

IE8でのAjaxキャッシュの問題と解決策

以上がJava 設計における Builder パターンの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート