개발자로서 우리 모두는 객체를 생성해야 하는 상황에 직면해 있습니다. 이 개체에 대한 일반 클래스를 디자인할 때의 문제점은 여러 형식을 취할 수 있다는 것입니다. 간단한 예: 플랫폼의 User 클래스. 일반 사용자의 경우 이메일과 사용자 이름만 필요할 수 있습니다. 그러나 플랫폼 관리자의 경우 전화번호와 같은 추가 속성이 필요할 수 있습니다. 신용 카드 번호 등의 추가 필드가 필요한 프리미엄 사용자도 있을 수 있습니다.
그렇다면 어떻게 일반적인 방식으로 진행할 수 있나요?
이 문제에 직면한 개발자 커뮤니티는 인기 있는 생성 패턴인 빌더 디자인 패턴에 동의했습니다. 이 패턴에는 복잡한 개체의 구성을 해당 표현과 분리하여 동일한 구성 프로세스를 사용하여 여러 개체 변형을 생성할 수 있습니다.
이 패턴은 속성이 많은 객체에 특히 유용합니다. 그 중 일부는 특정 경우에는 선택 사항일 수 있지만 다른 경우에는 선택 사항이 아닐 수도 있고 자세한 초기화 프로세스가 필요한 객체의 경우에도 마찬가지입니다. 코드를 지나치게 복잡하게 만들거나 생성자를 너무 오버로드하지 않고도 유연하고 단계별로 객체를 생성할 수 있습니다.
우리가 다룰 섹션
Builder 디자인 패턴은 다음과 같은 경우에 특히 유용합니다.
객체에 많은 속성이 있고 그 중 일부는 선택 사항인 경우: 이 기사의 시작 부분에서 제기한 문제로 돌아가서 User 클래스를 고려해 보겠습니다. 우리가 설명한 논리를 기반으로 이 User 클래스를 인스턴스화하면 일반 사용자의 경우 일반 사용자 = 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 클래스가 있습니다. 첫 번째 단계는 주문을 하는 것이며, 그런 다음 준비를 마치고 최종적으로 배송됩니다. 주문을 준비하려면 여러 단계가 필요할 수 있으며 올바른 구성 순서를 보장하려면 빌더 디자인 패턴이 매우 유용합니다.
동일한 개체의 여러 표현 지원: 예를 들어 직물, 색상 및 브랜드에 대한 속성이 있는 의류 클래스입니다. 의류 품목은 바지, 티셔츠 또는 기타 유형일 수 있습니다. 여기서 빌더 패턴은 동일한 기본 클래스의 다양한 표현을 생성하는 데 도움이 됩니다.
빌더의 구현을 보기 전에 섹션에서 본 각 사례에 대해
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!