24.08.2017

Builder Tasarim Deseni - Builder Design Pattern

Builder (Insaatçi) tasarim deseni creational grubununa ait, biden fazla parçadan olusan nesnelerin üretilmesinden sorumlu bir tasarim desenidir. dofactory.com a göre kullanim orani 40% larda olan builder tasarim deseni yapi olarak abstract factory desenine benzer.

Bazi nesneler birden fazla nesnenin birlesmesinden(bazi islemleri yapmasi sonucu) olusabilir. Zamanla bu ana nesneyi olusturan nesnelerin yapisi degisebilir, bu nesnelerin olusturulmasi karisik bir hal alabilir veya bu nesnelere baska nesneler de eklenebilir. Builder tasarim deseni bu gibi durumlarda genisletilebilirligi saglamak ve kod karmasikligini engellemek için kullanilir. Builder tasarim deseninde bu nesnelerin olusturulmasi Builder denilen siniflarin sorumlulugundadir. Client sadece olusturulacak nesne türünü belirterek ana nesneyi olusturan nesnelerin olusturulmasiyla ilgilenmez. Abstract factory tasarim kalibi ile benzer bir yapisi vardir. Aralarindaki fark builder tasarim deseni birden fazla nesnenin birlesmesinden olusan nesnelerin üretilmesinden sorumludur.

Builder desenini olusturan 4 yapi vardir.

  • Product: Olusturulan nesne.
  • Builder: Product olusturacak nesnelerin (Concrete Builder) uygulamasi gereken arayüz.
  • Concrete Builder: Product nesnesini olusturan nesne veya özelliklerin olusturuldugu siniflar. Her concrete builder sinifi ayni arayüzde farkli bir ürünün olusturulmasini saglar.
  • Director: Verilen builder nesnesine göre product örnegi olusturur.

Örnegin Marka, Model ve Lastik özellikleri olan bir araba nesnemiz olsun. Bu araba nesnemizin özelliklerinin farkli degerler almasi ile farkli özelliklerde araba nesnesi üretebiliriz. Builder tasarim deseni ile bu senaryoyu gerçeklestirelim. Uygulamamizin class diyagrami asagidadir.

 

  public class Araba
    {
        public string Marka { get; set; }
        public string Motor { get; set; }
        public string Lastik { get; set; }
 
        public override string ToString()
        {
            return String.Format("Marka:{0},Motor:{1},Lastik:{2}", Marka, Motor, Lastik);
        }
    }
 
    // ArabaBuilder arayüzü builder desenindeki Builder yapisidir. 
    // Bir sinifin Product i olusturan nesneleri olusturmasi veya product in özelliklerini setlemesi ile product i olusturan siniflar bu arayüzü kullanmalidir.
    public abstract class ArabaBuilder
    {
        protected Araba _araba;
        public Araba araba
        {
            get { return _araba; }
        }
        public abstract void MotorTak();
        public abstract void LastikTak();
    }
 
    // ArabaBuilder arayüzünden türeyen bütün siniflar Builder desenindeki ConcreteBuilder yapisidir.
    // ConcreteBuilder yapisi degisik product nesnelerinin olusturulmasini saglamaktir.
    public class ArabaConcrete1 : ArabaBuilder
    {
        public ArabaConcrete1()
        {
            _araba = new Araba { Marka = "Concrete1" };
        }
 
        public override void MotorTak()
        {
            _araba.Motor = "1.4 LPG";
        }
 
        public override void LastikTak()
        {
            _araba.Lastik = "15' Çelik jant";
        }
    }
 
    public class ArabaConcrete2 : ArabaBuilder
    {
        public ArabaConcrete2()
        {
            _araba = new Araba { Marka = "Concrete2" };
        }
 
        public override void MotorTak()
        {
            _araba.Motor = "1.8 Dizel";
        }
 
        public override void LastikTak()
        {
            _araba.Lastik = "17' Bor alasimli çelik jant";
        }
    }
 
    // ArabaBuilder arayüzündeki metodlari çalistirarak productin olusturulmasini saglar.
    // Builder desenindeki Director yapisidir.
    public class ArabaDirector
    {
        public ArabaDirector(ArabaBuilder ArabaConcrete)
        {
            ArabaConcrete.MotorTak();
            ArabaConcrete.LastikTak();
        }
    }
 
Desenimizi asagidaki sekilde kullanabiliriz.
 
class Program
{
    static void Main(string[] args)
    {
        ArabaBuilder araba_builder = new ArabaConcrete1();
        ArabaDirector araba_olusutucu = new ArabaDirector(araba_builder);
        Console.WriteLine(araba_builder.araba.ToString());
 
        araba_builder = new ArabaConcrete2();
        araba_olusutucu = new ArabaDirector(araba_builder);
        Console.WriteLine(araba_builder.araba.ToString());
 
        Console.ReadKey();
    }
}

Örnek uygulamayi asagidaki linkten indirebilirsiniz.

BuilderSample.rar