ホームページ > 記事 > ウェブフロントエンド > Builder デザイン パターンをマスターする: 複雑なオブジェクトの作成を簡素化する
私たち開発者は皆、オブジェクトを作成する必要がある状況に遭遇したことがあります。このオブジェクトのジェネリック クラスを設計しようとする場合の問題は、クラスが複数の形式を取る可能性があることです。簡単な例: プラットフォームの User クラス。通常のユーザーの場合、必要なのは電子メールとユーザー名だけかもしれません。ただし、プラットフォーム管理者の場合は、電話番号などの追加の属性が必要になる場合があります。また、プレミアム ユーザーを作成することもできます。この場合、クレジット カード番号などの追加フィールドが必要になります。
それでは、一般的な方法でどのように進めればよいでしょうか?
この問題に直面して、開発者コミュニティは、一般的な作成パターンであるビルダー デザイン パターンに同意しました。このパターンでは、複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスを使用して複数のオブジェクトのバリアントを作成できるようにします。
このパターンは、多くの属性を持つオブジェクトで特に便利です。属性の一部は特定の場合にはオプションですが、他の場合にはオプションではない場合や、詳細な初期化プロセスが必要なオブジェクトの場合に便利です。これにより、コードが過度に複雑になったりコンストラクターが過負荷になったりすることなく、柔軟で段階的なオブジェクトの作成が可能になります。
これから取り上げるセクション
ビルダー デザイン パターンは、次の場合に特に役立ちます。
オブジェクトに多くの属性があり、そのうちのいくつかはオプションである場合: この記事の冒頭で提起した問題に戻って、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 値が発生します。
複数ステップの作成プロセスを持つオブジェクト: 例は Order クラスです。最初のステップは注文であり、その後準備され、最終的に配送されます。注文の準備には複数の手順が必要な場合があります。建設の正しい順序を確保するには、ビルダー設計パターンが非常に役立ちます。
同じオブジェクトの複数の表現のサポート: たとえば、生地、色、ブランドの属性を持つ Clothing クラス。衣類アイテムには、パンツ、T シャツ、またはその他のタイプがあります。ここで、ビルダー パターンは、同じ基本クラスのさまざまな表現を作成するのに役立ちます。
前のセクションで見た各ケースについて、ビルダーの実装を見ていきます
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();
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"
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();
ビルダー デザイン パターンは、特にオブジェクト作成の複雑さを管理する場合に、いくつかの重要な理由から重要です。これが非常に価値がある理由は次のとおりです:
オブジェクトに多くの属性があり、その一部がオプションであるか、特定の順序で設定する必要がある場合、ビルダー パターンはオブジェクトを作成するための明確で構造化された方法を提供します。
ビルダー パターンは、オブジェクト作成ロジックをオブジェクト自体から分離することにより、コードをより読みやすく、保守しやすくします。
ビルダー パターンでは、パラメーターの異なる組み合わせを持つ複数のコンストラクターを使用する代わりに、コンストラクターのオーバーロードが不要になります。
ビルダーは、オブジェクトの構築とその表現を分離します。これは、オブジェクトの表現に影響を与えることなくオブジェクトの構築方法を変更できること、またはその逆が可能であることを意味します。
ビルダー デザイン パターンは、複雑なオブジェクトの作成を扱う開発者にとって不可欠なツールです。構築プロセスを明確で管理しやすいステップに分割することで、コードの可読性、保守性、柔軟性が向上します。多くの属性を持つオブジェクトを扱う場合でも、複数ステップの構築が必要な場合でも、複数の構成をサポートする必要がある場合でも、ビルダー パターンは、過度に複雑なコンストラクターを防ぎ、エラーを減らすエレガントなソリューションを提供します。
ブログの内容:
以上がBuilder デザイン パターンをマスターする: 複雑なオブジェクトの作成を簡素化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。