복잡하게 생성되어야 할 객체를 구현할 때 구성을 분리하여 다른 표현으로 만들 수 있게 하는 디자인 패턴

장점
단점
public struct Hamburger {
public let meat: Meat
public let sauce: Set<Sauce>
public let vegetable: Set<Vegetable>
public let bread: Bread
func getAllProperty() {
print("Meat = \(meat)")
print("Sauce = \(sauce)")
print("Vegetable = \(vegetable)")
print("Bread = \(bread)\n")
}
}
public enum Meat: String {
case beef
case chicken
case pork
}
public enum Sauce: String {
case mayonnaise
case mustard
case ketchup
case secret
}
public enum Vegetable: String {
case cabbage
case lettuce
case pickels
case tomatoes
}
public enum Bread: String {
case brownBread
case hotDogBun
case mealBread
case ryeBread
}
출처: https://icksw.tistory.com/236 [PinguiOS:티스토리]
Builder 정의
public class HamburgerBuilder {
public private(set) var meat: Meat = .beef
public private(set) var sauces: Set<Sauce> = []
public private(set) var vegetables: Set<Vegetable> = []
public private(set) var bread: Bread = .brownBread
public func addSauce(_ sauce: Sauce) {
sauces.insert(sauce)
}
public func removeSauce(_ sauce: Sauce) {
sauces.remove(sauce)
}
public func addVegetable(_ vegetable: Vegetable) {
vegetables.insert(vegetable)
}
public func removeVegetable(_ vegetable: Vegetable) {
vegetables.remove(vegetable)
}
public func setMeat(_ meat: Meat) {
self.meat = meat
}
public func setBread(_ bread: Bread) {
self.bread = bread
}
public func build() -> Hamburger {
return Hamburger(meat: meat, sauce: sauces, vegetable: vegetables, bread: bread)
}
}
Director 정의
고정된 모양의 햄버거를 만들 수 있다.
```swift
class HamburgerDirector {
public func createBeefBurger() -> Hamburger {
let builder = HamburgerBuilder()
builder.setMeat(.beef)
builder.addSauce(.ketchup)
builder.addSauce(.mustard)
builder.addVegetable(.pickels)
builder.addVegetable(.lettuce)
builder.setBread(.ryeBread)
return builder.build()
}
public func createChickenBurger() -> Hamburger {
let builder = HamburgerBuilder()
builder.setMeat(.chicken)
builder.addSauce(.secret)
builder.addSauce(.mayonnaise)
builder.addVegetable(.cabbage)
builder.addVegetable(.tomatoes)
builder.setBread(.brownBread)
return builder.build()
}
}
```
커스텀 뷰를 만들거나 UIStackView를 사용할 때 적용할 수 있다.
addArrangedSubview(_:)로 만들어 추가class CustomView: UIView {
private let containerView = CustomContainerView()
private func configureContainerView() {
// configure basic settings
}
func addTitle(_ title: String, spacing: CGFloat = 10) {
let label = UILabel()
...
containerView.stackView.addArrangedSubview(label)
}
func withSubTitle(_ subTitle: String) {
let label = UILabel()
...
containerView.stackView.addArrangedSubview(label)
}
func addImage(_ image: UIImage, size: CGSize) {
let imageView = UIImageView(image: image)
...
containerView.stackView.addArrangedSubview(imageView)
}
func addButtons(_ buttons: [CustomButton]) {
containerView.addButtonStackView()
buttons.forEach {
containerView.buttonStackView.addArrangedSubview($0)
}
}
}
let customView1 = CustomViewBuilder()
.withTitle("Notice")
.withSubTitle("Are you sure to delete this list?")
.withButtons([.cancelButton, .okButton])
.build()
let customView2 = CustomViewBuilder()
.withImage(defaultImage)
.withButtons([.cancelButton, .okButton])
.withTitle("Notice")
.withSubTitle("Are you sure to delete this list?")
.build()