Builder Design Pattern
Builder pattern'ini oldukça sık kullanılan Creational Design Pattern 'lerden birisidir. Class'larınızda çok fazla parametre varsa veya farklı parametreler ile farklı constructor'larınız varsa kullanabileceğiniz bir patern'dir. 3 bileşenden oluşmaktadır. Bunlar; Director, Builder ve Product'dır.
Aşağıda çok yaygın olarak kullanılan bir örnek paylaşıyorum.
Product: Oluşturulacak karmaşık nesnelerdir.
URLRequest
and URLSessionDataTask
mevcutta olduğu için yeniden oluşturmaya gerek yok sadece kullanılacak property'ler tanımlanmıştır.
Builder: girdileri adım adım ekler ve ürünün oluşmasını yönetir. Genellikle sınıf tipindedir ve refrans olarak istenildiğinde yeniden kullanılabilir.
Task'ın gerçekleştirilmesi için Task Builder yazılmıştır. URLSessionDataTask
kullanılmıştır.
Director: tanımlanan parametreler builder ile nesne olarak oluşturulacaktır. Örnekteki projenin Director'ü UIViewControllerdir.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let requestBuilder = RequestBuilder()
requestBuilder.setBaseUrl(RequestBaseUrls.gitHub)
requestBuilder.setEndpoint(RequestEndpoints.searchRepositories)
requestBuilder.setMethod(.GET)
requestBuilder.addHeader("Content-Type", "application/json")
requestBuilder.addParameter("q", "Builder Design Pattern")
let request = requestBuilder.build()
let taskBuilder = TaskBuilder()
taskBuilder.setRequest(request)
let task = taskBuilder.build()
task.resume()
}
}
//Playground'da test etmek için aşağıdaki kodu çağırabilirsiniz.
let viewController = ViewController()
PlaygroundPage.current.liveView = viewController
PlaygroundPage.current.needsIndefiniteExecution = true
//Builder Design Pattern ismindeki repolar döndürülecektir.
Bonus: Konunun daha iyi anlaşışması için bir örnek daha paylaşıyorum.
struct Theme {
let textColor: UIColor?
let backgroundColor: UIColor?
}
class ThemeBuilder {
enum Style {
case light
case dark
}
func build(_ style: Style) -> Theme {
switch style {
case .light:
return Theme(textColor: .black, backgroundColor: .white)
case .dark:
return Theme(textColor: .white, backgroundColor: .black)
}
}
}
let builder = ThemeBuilder()
let light = builder.build(.light)
let dark = builder.build(.dark)