ホームページ  >  記事  >  ウェブフロントエンド  >  Builder デザイン パターンをマスターする: 複雑なオブジェクトの作成を簡素化する

Builder デザイン パターンをマスターする: 複雑なオブジェクトの作成を簡素化する

DDD
DDDオリジナル
2024-11-12 06:28:02381ブラウズ

Mastering the Builder Design Pattern: Simplifying Complex Object Creation

導入

私たち開発者は皆、オブジェクトを作成する必要がある状況に遭遇したことがあります。このオブジェクトのジェネリック クラスを設計しようとする場合の問題は、クラスが複数の形式を取る可能性があることです。簡単な例: プラットフォームの User クラス。通常のユーザーの場合、必要なのは電子メールとユーザー名だけかもしれません。ただし、プラットフォーム管理者の場合は、電話番号などの追加の属性が必要になる場合があります。また、プレミアム ユーザーを作成することもできます。この場合、クレジット カード番号などの追加フィールドが必要になります。

それでは、一般的な方法でどのように進めればよいでしょうか?

この問題に直面して、開発者コミュニティは、一般的な作成パターンであるビルダー デザイン パターンに同意しました。このパターンでは、複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスを使用して複数のオブジェクトのバリアントを作成できるようにします。

このパターンは、多くの属性を持つオブジェクトで特に便利です。属性の一部は特定の場合にはオプションですが、他の場合にはオプションではない場合や、詳細な初期化プロセスが必要なオブジェクトの場合に便利です。これにより、コードが過度に複雑になったりコンストラクターが過負荷になったりすることなく、柔軟で段階的なオブジェクトの作成が可能になります。

これから取り上げるセクション

  1. ビルダー パターンとは何ですか?
  2. いつ使用するべきですか?
  3. ビルダーの実際の使用例
  4. なぜこのパターンがそれほど重要なのでしょうか?
  5. 結論 ## ビルダー パターンとは何ですか? ビルダー デザイン パターン は、複雑なオブジェクトの制御された柔軟な構築を可能にする創造的なデザイン パターンです。ビルダーは、多数のパラメーターを受け取るコンストラクターを使用する代わりに、オブジェクトを段階的に作成するためのスムーズなインターフェイスを提供します。これは、オブジェクトに多くの属性、特定の構築手順、または複数の可能な構成がある場合に役立ちます。

いつ使用する必要がありますか?

ビルダー デザイン パターンは、次の場合に特に役立ちます。

  1. オブジェクトに多くの属性があり、そのうちのいくつかはオプションである場合: この記事の冒頭で提起した問題に戻って、User クラスを考えてみましょう。説明したロジックに基づいて、この User クラスをインスタンス化すると、さまざまなケースが考えられます。通常のユーザーの場合は、normalUser = new User("houda", "houda@gmail.com", null, null)、管理者の場合は、normalUser = new User("houda", "houda@gmail.com", null, null) adminUser = new User("houda", "houda@gmail.com", "0657...", null)、プレミアム ユーザーの場合は、premiumUser = new User("houda", "houda@gmail.com", null、「1234...」)。これにより、インスタンス化で多くの null 値が発生します。

  2. 複数ステップの作成プロセスを持つオブジェクト: 例は Order クラスです。最初のステップは注文であり、その後準備され、最終的に配送されます。注文の準備には複数の手順が必要な場合があります。建設の正しい順序を確保するには、ビルダー設計パターンが非常に役立ちます。

  3. 同じオブジェクトの複数の表現のサポート: たとえば、生地、色、ブランドの属性を持つ Clothing クラス。衣類アイテムには、パンツ、T シャツ、またはその他のタイプがあります。ここで、ビルダー パターンは、同じ基本クラスのさまざまな表現を作成するのに役立ちます。

ビルダーの実際の使用例

前のセクションで見た各ケースについて、ビルダーの実装を見ていきます

  1. オブジェクトに多くの属性があり、その一部はオプションである場合:
class User {
    username: string;
    email: string;
    phoneNumber?: string;
    creditCard?: string;

    private constructor(builder: UserBuilder) {
        this.username = builder.username;
        this.email = builder.email;
        this.phoneNumber = builder.phoneNumber;
        this.creditCard = builder.creditCard;
    }

    public static get Builder() {
        return new UserBuilder();
    }
}

class UserBuilder {
    username!: string;
    email!: string;
    phoneNumber?: string;
    creditCard?: string;

    public setUsername(username: string): UserBuilder {
        this.username = username;
        return this;
    }

    public setEmail(email: string): UserBuilder {
        this.email = email;
        return this;
    }

    public setPhoneNumber(phoneNumber: string): UserBuilder {
        this.phoneNumber = phoneNumber;
        return this;
    }

    public setCreditCard(creditCard: string): UserBuilder {
        this.creditCard = creditCard;
        return this;
    }

    public build(): User {
        return new User(this);
    }
}

// Usage
const normalUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .build();

const adminUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .setPhoneNumber("0657....")
    .build();

const premiumUser = User.Builder
    .setUsername("houda")
    .setEmail("houda@gmail.com")
    .setCreditCard("1234....")
    .build();

  1. 複数ステップの作成プロセスを持つオブジェクト:
class Order {
    private state: string;

    private constructor(builder: OrderBuilder) {
        this.state = builder.state;
    }

    public static get Builder() {
        return new OrderBuilder();
    }

    public getState(): string {
        return this.state;
    }
}

class OrderBuilder {
    state: string = "Placed";

    public prepareOrder(): OrderBuilder {
        if (this.state === "Placed") {
            this.state = "Prepared";
        }
        return this;
    }

    public deliverOrder(): OrderBuilder {
        if (this.state === "Prepared") {
            this.state = "Delivered";
        }
        return this;
    }

    public build(): Order {
        return new Order(this);
    }
}

// Usage
const completedOrder = Order.Builder
    .prepareOrder()
    .deliverOrder()
    .build();
console.log(completedOrder.getState()); // "Delivered"

  1. 同じオブジェクトの複数の表現をサポート:
class Clothing {
    type: string;
    fabric: string;
    color: string;
    brand: string;

    private constructor(builder: ClothingBuilder) {
        this.type = builder.type;
        this.fabric = builder.fabric;
        this.color = builder.color;
        this.brand = builder.brand;
    }

    public static get Builder() {
        return new ClothingBuilder();
    }
}

class ClothingBuilder {
    type!: string;
    fabric!: string;
    color!: string;
    brand!: string;

    public setType(type: string): ClothingBuilder {
        this.type = type;
        return this;
    }

    public setFabric(fabric: string): ClothingBuilder {
        this.fabric = fabric;
        return this;
    }

    public setColor(color: string): ClothingBuilder {
        this.color = color;
        return this;
    }

    public setBrand(brand: string): ClothingBuilder {
        this.brand = brand;
        return this;
    }

    public build(): Clothing {
        return new Clothing(this);
    }
}

// Usage
const tShirt = Clothing.Builder
    .setType("T-Shirt")
    .setFabric("Cotton")
    .setColor("Blue")
    .setBrand("BrandA")
    .build();

const pants = Clothing.Builder
    .setType("Pants")
    .setFabric("Denim")
    .setColor("Black")
    .setBrand("BrandB")
    .build();

なぜこのパターンがそれほど重要なのでしょうか?

ビルダー デザイン パターンは、特にオブジェクト作成の複雑さを管理する場合に、いくつかの重要な理由から重要です。これが非常に価値がある理由は次のとおりです:

  1. 複雑なオブジェクトの処理

オブジェクトに多くの属性があり、その一部がオプションであるか、特定の順序で設定する必要がある場合、ビルダー パターンはオブジェクトを作成するための明確で構造化された方法を提供します。

  1. コードの可読性と保守性を向上させます

ビルダー パターンは、オブジェクト作成ロジックをオブジェクト自体から分離することにより、コードをより読みやすく、保守しやすくします。

  1. コンストラクターのオーバーロードを軽減します

ビルダー パターンでは、パラメーターの異なる組み合わせを持つ複数のコンストラクターを使用する代わりに、コンストラクターのオーバーロードが不要になります。

  1. 懸念事項の明確な分離

ビルダーは、オブジェクトの構築とその表現を分離します。これは、オブジェクトの表現に影響を与えることなくオブジェクトの構築方法を変更できること、またはその逆が可能であることを意味します。

結論

ビルダー デザイン パターンは、複雑なオブジェクトの作成を扱う開発者にとって不可欠なツールです。構築プロセスを明確で管理しやすいステップに分割することで、コードの可読性、保守性、柔軟性が向上します。多くの属性を持つオブジェクトを扱う場合でも、複数ステップの構築が必要な場合でも、複数の構成をサポートする必要がある場合でも、ビルダー パターンは、過度に複雑なコンストラクターを防ぎ、エラーを減らすエレガントなソリューションを提供します。

ブログの内容:

  1. ビルダー パターンとは何ですか?
  2. いつ使用するべきですか?
  3. ビルダーの実際の使用例
  4. なぜこのパターンがそれほど重要なのでしょうか?

以上がBuilder デザイン パターンをマスターする: 複雑なオブジェクトの作成を簡素化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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