Builder deseni, karmaşık yapıdaki nesnelerin oluşturulmasında istemcinin sadece nesne tipini belirterek üretimi gerçekleştirebilmesini sağlamak için kullanılan bir desendir. Bu desende istemcinin kullanmak istediği gerçek ürünün birden fazla sunumunun olduğu durumlarda kullanılır.
Builder deseni birden fazla parçadan oluşan kompleks yapıdaki bir nesnenin oluşturulmasını ve bu kompleks nesnenin oluşturulma safhalarını istemci modülünden tamamen gizlemek için kullanılır. Kompleks nesnenin yaratılması istemci modülünden tamamen yalıtıldığı için nesnenin yaratılması ile ilgili işlemler farklı versiyonlarda tamamen değiştirilebilir. Bu durum, istemci programın çalışmasını hiç bir şekilde etkilemeyecektir.
Bu diyagram refactoring.guru üzerinden alınmıştır.
Builder: Product nesnesinin oluşturulması için gerekli soyut arayüzü sunar.
ConcreteBuilder: Product nesnesini oluşturur. Product ile ilişkili temel özellikleri de uygular.
Director: Builder arayüzünü kullanarak nesne örneklemesini yapar.
Product: Üretim sonucu ortaya çıkan nesneyi temsil eder. Dahili yapısı(örneğin temel özellikleri) ConcreteBuilder tarafından inşa edilir.
Senaryo olarak da online bir eğitim platformunun ilk defa eğitim alacak olan öğrencilere ilk eğitimini yarı fiyatına verdiği düşünülsün.
C# Kod Örneği:
// UML diyagramındaki Product sınıfına denk gelmektedir.// Farklı sunumları olan sınıfımız budur.classLesson{publicint id;publicstring name;publicstring price;publicstring discountedPrice;publicbool discountApplied;publicstring lessonNote;}
// UML diyagramındaki Product'a denk gelen Lesson sınıfıa ait nesnenin oluşturulması için soyut arayüz sağlar.// Yapılması gereken adımlar içerisinde tanımlıdır.abstractclassLessonBuilder{publicLesson lesson;publicabstractvoidGetLesson();publicabstractvoidApplyDiscount();publicabstractvoidAddLessonNote();publicabstractLessonGetResult();}
// LessonBuilder sınıfından türer ve orada tanımlı adımları gerçekleştirir.// UML diyagramındaki ConcreteBuilder sınıfına denk gelmektedir.classNewStudentLessonBuilder:LessonBuilder{ // Burada nesne çağırma işlemleri gerçekleştirilmektedir. // Nasıl çağrılacağı tamamen geliştiriciye kalmıştır. // Çıktıyı görmek amacıyla 1-2 değer ataması yapılacaktır.publicoverridevoidGetLesson() { lesson =newLesson();lesson.id=1;lesson.name="Artificial Intelligence - Beginner to Advanced in 10 Minute.";lesson.price=49.99; } // Burada yeni öğrenciler için geçerli derste %50'lik bir indirim mevcut.publicoverridevoidApplyDiscount() {lesson.discountedPrice=lesson.price*0.5;lesson.discountApplied=true; }publicoverridevoidAddLessonNote() {lesson.lessonNote="Hey, welcome. Your discount code has been applied!"; }publicoverrideLessonGetResult() {return lesson; }}
// LessonBuilder sınıfından türer ve orada tanımlı adımları gerçekleştirir.// UML diyagramındaki ConcreteBuilder sınıfına denk gelmektedir.classOldStudentLessonBuilder:LessonBuilder{ // Burada nesne çağırma işlemleri gerçekleştirilmektedir. // Nasıl çağrılacağı tamamen geliştiriciye kalmıştır. // Çıktıyı görmek amacıyla 1-2 değer ataması yapılacaktır.publicoverridevoidGetLesson() { lesson =newLesson();lesson.id=1;lesson.name="Artificial Intelligence - Beginner to Advanced in 10 Minute.";lesson.price=49.99; } // Burada eski öğrenciler için geçerli derste herhangi bir indirim yapılmadı.publicoverridevoidApplyDiscount() {lesson.discountedPrice=lesson.price;lesson.discountApplied=false; }publicoverridevoidAddLessonNote() {lesson.lessonNote=""; }publicoverrideLessonGetResult() {return lesson; }}
// Builder arayüzünü kullanarak nesne örneklemesi yapar.// UML diyagramındaki Director'a denk gelmektedir.classLessonDirector{privateLessonBuilder lessonBuilder;publicLessonDirector(LessonBuilder lessonBuilder) {this.lessonBuilder= lessonBuilder; }publicvoidMake() {lessonBuilder.GetLesson();lessonBuilder.ApplyDiscount();lessonBuilder.AddLessonNote(); }}