Akşamları evde kitap okumaktan sıkıldınız ve içinizden “ah bir televizyonum olsa da cnbc-e de South Park izleseydim” diye bir düşübce geçti. Ertesi gün tv fiyatlarını sormak için çarşıya gittiniz ve televizyon satan iki dükkanın tam olarak ortasında durdunuz. Dükkanlardan birisi Sony marka televizyon satıyor diğeri de Regal marka televizyon satıyor.

-Kurguladığımız senaryo gereği her markanın sadece tek bir modeli var :) -

İlk önce Sony marka tv satan dükkana girip ve sony marka tv nin fiyatını soracaz ardından regal marka tv satan dükkana girip regal marka tv nin fiyatını soracaz. Başlıyoruz…

Sony marka tv satan dükkana giriyoruz.
Keko : s.a.
SonyBayi : a.s.
Keko : abi televizyonun fiyatı nedir?
SonyBayi : 5 lira
Keko : hiiimmm.tesekkurler. iyi gunler…
SonyBayi : iyi günler…
Dükkandan çıkıyoruz.

ilk fiyat bilgisini aldık. şimdi sıra ikincisinde…

Regal marka tv satan dükkana giriyoruz.
Keko : s.a.
RegalBayi : a.s.
Keko : abi televizyonun fiyatı nedir?
RegalBayi : 3 lira
Keko : hiiimmm.tesekkurler. iyi gunler…
RegalBayi : iyi günler…
Dükkandan çıkıyoruz.

ikinci fiyat bilgisini de aldık

40 puanlık uzman sorusu.

iki dialog arasindaki farkları bulun.

cevap: cevaplar :)

her iki satıcıya da aynı soruları sordum ama farklı cevaplar aldım. Sorularda hiç marka adı telaffuz etmedim ama satıcılar hangi markayı kastettiğimi anladılar. Gerçek dünyada sony bayiinde regal marka tv nin fiyatını sormayacağım çok açık. Bulunduğum konum ile sorduğum soru arasında birbirini tamamlama ilişkisi var. Bu sayede aynı sorularla farklı şeyleri anlatabiliyor veya sorabiliyoruz.

Peki programlama aleminde böyle bir şeyi nasıl yapabiliriz?

cevap : abstract factory

Abstract factory kalıbı birbirine benzer nesneleri ortak bir ara katman aracılığıyla kullanabilmemize imkan sağlar. Size yeni bir özelliği nasıl kullanacağınızı soylemez sadece bu tip bir durumda anlaşılması, bakımı, geliştirilmesi daha kolay bir yapı kurmanıza yardımcı olur. İşletim sisteminden, veritabanından bağımsız programlar yazmak isterseniz bu kalıp çok işinize yarar. bunun yanında kullanacağını nesneleri bir if veya case yardımıyla seçiyorsanız abstract factory kalıbı kullanma zamanınız gelmiş demektir :)

biz şimdi yukarıdaki orneğimizi yapalım.

İlk once soyut bir TV ve Satıcı tanımlayacaz. Ardından bu soyut sınıfları kullanarak Regal ve Sony marka Tv ler olusturacaz. Soyut satıcı sınıfından Regal ve Sony satıcılarını oluşturacaz. Sonra bu soyut sınıfları olusturacak soyut bir Marka sınıfı tanımlayacaz. Bu soyut marka sınıfından ise somut Regal ve Sony Markalarını olusturacz. Son olarak ta Keko adında bir musteri nesnesi…

unit AbstractFactory;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

 TSoyutTVSaticisi = Class; //ilerde tekrar tanımlanacak
 TSoyutTV = Class;         //ilerde tekrar tanımlanacak
 TSoyutMarka = Class
  public
    function TVSaticisi: TSoyutTVSaticisi; virtual; abstract;
    function TV: TSoyutTV; virtual; abstract;
  end;

 TRegalMarka  = Class(TSoyutMarka)
 public
    function TVSaticisi: TSoyutTVSaticisi; override;
    function TV: TSoyutTV; override;
  end;

 TSonyMarka  = Class(TSoyutMarka)
 public
    function TVSaticisi: TSoyutTVSaticisi; override;
    function TV: TSoyutTV; override;
  end;

 TKeko = class
 private
    TVSaticisi: TSoyutTVSaticisi;
    TV: TSoyutTV;
  public
    // Constructors
    constructor Create(TVMarka: TSoyutMarka);
    destructor Destroy; override;
    // Methods
    function FiyatSor:String;
  end;

 TSoyutTV = class
  function Fiyat:String;virtual;abstract;
  end;

 TSonyTV = class(TSoyutTV)
  function Fiyat:String;override;
  end;

 TRegalTV = class(TSoyutTV)
  function Fiyat:String;override;
  end;

 TSoyutTVSaticisi = class
   function FiyatSoyle(TV:TSoyutTV):String;virtual;abstract;
  end;

 TSonyTVSaticisi = class(TSoyutTVSaticisi)
   function FiyatSoyle(TV:TSoyutTV):String;override;
  end;

 TRegalTVSaticisi = class(TSoyutTVSaticisi)
   function FiyatSoyle(TV:TSoyutTV):String;override;
  end;

implementation

{ TRegalMarka }

function TRegalMarka.TV: TSoyutTV;
begin
   Result :=TRegalTV.Create;
end;

function TRegalMarka.TVSaticisi: TSoyutTVSaticisi;
begin
   Result :=TRegalTVSaticisi.Create;
end;

{ TSonyMarka }

function TSonyMarka.TV: TSoyutTV;
begin
 result:=TSonyTV.Create;
end;

function TSonyMarka.TVSaticisi: TSoyutTVSaticisi;
begin
 result:=TSonyTVSaticisi.Create;
end;

{ TKeko }

constructor TKeko.Create(TVMarka: TSoyutMarka);
begin
  self.TVSaticisi := TVMarka.TVSaticisi;
  self.TV         := TVMarka.TV;
end;

destructor TKeko.Destroy;
begin
  self.TVSaticisi.free;
  self.TV.free;
  inherited;
end;

function TKeko.FiyatSor: String;
begin
   Result :=TVSaticisi.FiyatSoyle(TV);
end;

{ TSonyTV }

function TSonyTV.Fiyat: String;
begin
 Result :=‘5 lira’;
end;

{ TRegalTV }

function TRegalTV.Fiyat: String;
begin
Result :=‘3 lira’;
end;

{ TSonyTVSaticisi }

function TSonyTVSaticisi.FiyatSoyle(TV: TSoyutTV): String;
begin
   Result :=‘Sony marka tv ‘ +  tv.Fiyat;
end;

{ TRegalTVSaticisi }

function TRegalTVSaticisi.FiyatSoyle(TV: TSoyutTV): String;
begin
   Result :=‘Regal marka tv ‘ +  tv.Fiyat;
end;

end.

şimdi bu sınıfları kullanacak programın görüntüsüne bakalım…


abstract

ComboBoxta ki itemlar tahmin edebileceğiniz gibi şu şekilde.

Sony Marka TV
Regal Marka TV

İster Sony Marka Tv yi seçip Fiyat sor düğmesine tıklıyorsunuz isterseniz Regal marka tv seçip. Seçtiğiniz tv nin fiyatı ise memoda gözüküyor. Şimdi düğmenin kodlarını yazalım.

procedure TForm1.Button1Click(Sender: TObject);
begin

  case ComboBox1.ItemIndex of
    0:Marka :=TSonyMarka.Create;     // hangi dükkana gireceğime karar veriyorum
    1:Marka :=TRegalMarka.Create;
  end;

  Keko :=TKeko.Create(Marka);      // sony/regal satan dükkana giriyorum
  Memo1.Lines.Add(keko.FiyatSor)// sony/regal marka tv nin fiyatını soruyorum

  FreeAndNil(Marka);
  FreeAndNil(Keko);
end;

Sony Marka Tv seçip Fiyat sor düğmesine tıklıyorum.
Memoda ki yazı :
Sony marka tv 5 lira

Regal marka TV seçip Fiyat sor düğmesine tıklıyorum.
Memoda ki yazı :
Sony marka tv 5 lira
Regal marka tv 3 lira

siz olsaydınız hangisini alırdınız ? :)

-abstract factory kalıbı işte bu asım.
-yahu sado, allah iyiliğini versin. sabah sabah guldurdun beni. ben de sonunda bise olacak diye bekliyorum yaaa!. deli misin nesin sen yaw? senin bu onlarca satırla yaptığın işi ben varya 4 satırla yaparım lan… yuh lan harbi yuuuhhh valla… al lan al. 4 satırlık kod. bu iş bu kadar basit ya…

case ComboBox1.ItemIndex of
0:memo1.Lines.Add(‘Sony Marka tv 5 lira’);
1:memo1.Lines.Add(‘Regal Marka tv 3 lira’);
end;

-Asım! son cümle olarak Charlie Calvert’in kitabindan alıntı yapıyorum.

Küçük yapısal programlar yazmak küçükk nesneye yonelik yazılımlar yapmaktan kolaydır ama büyük yapısal programlar yazmak büyük nesneye yonelik yazılımlar yapmaktan zordur.

büyük düşünün !

ornegi indir

dipnot: bu kalıbın birim testlerini nasıl yazabiliriz ?


17 Yorum : “Abstract Factory -Aklımı seveyim aklımı-”  

  1. Gravatar ikonu 1 onur

    senin bikaç tahtan eksik!!

  2. Gravatar ikonu 2 Ansugo

    Sado sana sadece sunu diyebilirim :

    yahu sado, allah iyiliğini versin. sabah sabah guldurdun beni. ben de sonunda bise olacak diye bekliyorum yaaa!. deli misin nesin sen yaw? senin bu onlarca satırla yaptığın işi ben varya 4 satırla yaparım

    Isleri cok karistirmamak lazim.

    Bende Ansugo’nun kitabindan bir alinti yapayim :

    Hangi dil olursa olsun, isi ne kadar kisa ve kolay tutarsaniz projeleriniz o kadar hizli ilerler. Karmasik isler nasil gercek hayatta kafamizi karistiriyorsa programlama aleminde de karistirir.

  3. Gravatar ikonu 3 sadettinpolat

    ansugo’nun kitabindan yapilmis olan alintiya aynen katiliyorum hatta daha da ileri giderek abstract factory kalibinin kitaptaki alintidan dolayi meydana ciktigini iddia ediyorum. yapilan ornekte bu cok iyi gorunmuyor olabilr ama bu kalibin temel mantigi karisik isleri daha basit bir hale getirmek, ilerde olusabilecek spagetti kodu onlemek ve bakimi/gelistirilmesi kolay bir kod meydana cikartmak.

    abstract factory kalibinin bize saglayacagi faydalari asagidaki yazida daha rahat gorebiliriz saniyorum.

    http://sadettinpolat.zaxaz.com/?p=89

    mersedes hem otobus hem de spor araba ureten bir firmadir.
    her iki urun icinde iki tane ayna bulunur. mersedes clk ile o403 un aynalari ayni degildir.
    uretim bandinda o an bir spor araba uretiliyorsa uretimden gorevli kisinin “bana bir spor araba aynasi ver” demesinin isleri karistirmaktan baska bir etkisi yoktur. ustelik gun gelir o uretim bandindaki gorevli evde karisiyla kavga ettigi icin “spor araba aynasi” isteyecegi yerde “o403 aynasi” isteyebilir.

    “bu o403 aynasi da clk ya ne yakismis be” derseniz bi problem yok :)

    uretim bandindaki gorevli hangi arabayi uretiyorsa ona uygun aynayi secebilmesi gerekir ama abstract factoy kalibi bunu bir robota verir. gorevli de sadece “bi ayna ver” der. robot o esnada hangi araba uretimdeyse ona uygun aynayi gorevliye verir.

    isin zahmetli tarafi robotu bir kereligine uretmektir.

  4. Gravatar ikonu 4 mcihad

    Ne yaptın yaw sen bu blog u renkler çok kötü insanın giresi gelmiy. Eski halişne getir hele şu blog u

  5. Gravatar ikonu 5 sadettinpolat

    :) 4 hafta sari kirmizi takilmamiz lazim ;)

  6. Gravatar ikonu 6 mcihad

    Niyeki yaw gözümü alıyor bu renkler. :D
    Interfacelerdeki Yiğit-yoğurt meselesini burda versen daha açıklayıcı olurdu yaw. Her yiğidin bir yoğurt yiyişi vardır dimi abstract metodlar işte bööle bişiy.

  7. Gravatar ikonu 7 mcihad

    Birde şu virtual ile dynamic bide reintroduce olaylarına gir yaw girmişken

  8. Gravatar ikonu 8 ali usta

    benim anlamadığım “Regal marka tv satan dükkana” girmemize rağmen sorularımıza neden SonyBayinin cevap verdiği : )

  9. Gravatar ikonu 9 mcihad

    hani nerde

  10. Gravatar ikonu 10 ali usta

    üstteki diyalogda

  11. Gravatar ikonu 11 sadettinpolat

    bravo! @ali usta :)
    copy/paste nin azizligine ugradimisim.
    duzeltiyorum birazdan :)

  12. Gravatar ikonu 12 ali usta

    birazın görece bir kavram olduğunu da öğrenmiş oluyoruz

    hadisene yau :p

    o hata düzelmediği müddetçe senin programının büsbütün yanlış olduğu sonucunu gözden kaçırmıyorsun umarım : )

  13. Gravatar ikonu 13 sadettinpolat

    hatayi sonunda duzelttim. “biraz” nerde bulundugunuza bagli olarak gorece bir kavram oluyor malesef. kimi yerlerde zaman adeta durabiliyor :)

  14. Gravatar ikonu 14 huseyinkucuk

    hey, insanlar… Süpersiniz yahu… Ama aşmışınız siz galiba… Böyle biraz daha temel (programlama hakkında) şeyler yok mu? Kendinize iyi bakın…

  15. Gravatar ikonu 15 Zafer

    Merhabalar önce sadettinpolatın yazdığı makaleyi keyifle okudum sonrasında ise daha keyifli yorumları okumak için devam ettim ama tam bir hüsrana ugradım.

    Son mesajda resmen koptum yanlız “hey, insanlar… Süpersiniz yahu… Ama aşmışınız siz galiba… Böyle biraz daha temel (programlama hakkında) şeyler yok mu? Kendinize iyi bakın…”

    İnsanlar bir konuda uzmanlaşmak için o konunun daha ileri seviyelerine ulaşmak isterler ve sayın sadettin polat bu işle ciddi anlamda ilgilnenlerin keyifle okuduğuna inandığım bir makale yazmış ama arkadaşlar bundan faydalanmak yerine bu gün her delphi sitesinde bulunan buton koy OnClick olayına şunları yaz tıkla çalışssın şeklinde makaleler istiyorlar, hayret etmemek mümkün değil, böyle bir konuda türkçe kaynak bulmak zor iken , sayın sadettin polat vakit ayırıp böyle güzel bir iş yapmış, ama insanların yorumlarına bakınca şaşırtıcı bir çelişki söz konusu

    Benim tüm bu sayfadan anladığım, ya bu işi yıllardır yapanlar bişey bilmiyor, yada yorum yapan arkadaşlar tabir-i caizse bu işi aşmış …

  16. Gravatar ikonu 16 huseyinkucuk

    :) Sanırım yanlış anlaşıldım… Ben de yukarıda yazılanları büyük bir keyifle okudum… Yazılanları anladım da (tabi şimdi bunlara bakmadan delphiyi açarsam anlatılanları yapabileceğim şüpheli, ayrı konu)… Takdir de ediyorum Saadettin Polat’ı (ve emeği geçen diğer kişileri). Ama ben “daha temel şeyler yok mu?” derken delphiyle ilgili her sitede olan “butona tıklayın, labeli değiştirin” vb. şeyleri kastetmemiştim (Bunları öyle ya da böyle herkes öğreniyor zaten)… Yukarıda yazan kod bana o kadar teknik gelmişti ki; ‘bunları anlatan kişinin bu işi temelden aldığı bir kaç döküman okusam (sınıf yapmak, komponent oluşturmak vb.) çok iyi olur’ diye düşünmüştüm…

    Zafer demiş ki: “Benim tüm bu sayfadan anladığım, ya bu işi yıllardır yapanlar bişey bilmiyor, yada yorum yapan arkadaşlar tabir-i caizse bu işi aşmış …”

    Estağfirullah, öyle bir iddiam yok…

  1. 1 Biri bizi gözetliyor ! at Delphi Blog

Yorum/Cevap Yaz