Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
ADO.NET/SQL
C / Sys Prog.
Genel
Mono ve .NET
Silverlight
XML / Web Serv.
X86 Assembly
C++ / C++.NET
J#.NET / Java
.NET 3.x
UML / Analiz
Yazılım Müh.
ASP.NET
C# / VC#/.NET
Mobil Prog.
PHP 5
YAZAR HAKKINDA
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için
tıklayın
.
71
Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için
tıklayın
.
Yayınlanan diğer makaleleri için
tıklayın
.
İlgili etiketler:
C# / VC#/.NET
Sefer Algan
YAZI HAKKINDA
Türü
:
Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır.
Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi
:
Başlangıç
Kategori
:
C# / VC#/.NET
Yayınlanma Tarihi
:
26.11.2003
Okunma Sayısı
:
33240
Yorum Sayısı
:
3
yorum yaz
SİTE İÇİ ARAMA
Üye
GİRİŞİ
Üye girişi için
tıklayın
.
Kullanıcı Adı
Şifre
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
Şifremi / Kullanıcı Adımı unuttum.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
Serbest KÖŞE
(?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır.
Bu yazılar editör incelemesine girmeden yayınlanır.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Turhal Temizer
Conda install environment.yml Package
21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA
21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak
21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi
21.11.2024
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
C# / VC#/.NET
/
"Builder" Tasarım Deseninin C# ile Gerçekleştirilmesi
"Builder" Tasarım Deseninin C# ile Gerçekleştirilmesi
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
Bu yazıda "Creational" desenler grubunda yer alan "Builder" tasarım deseninden ve bu deseni C# ile nasıl gerçekleştirebileceğimizden bahsedeceğim.
Bu yazıyı okumadan önce "
Singleton
" ve "
Abstract Factory
" tasarım desenlerini konu alan yazılarımı okumanızı tavsiye ederim.
"Builder" deseni adından da anlaşılacağı üzere bir nesnenin oluşturulması ile ilgilidir. Bu desende kullanılan yapılar hemen hemen "Abstract Factory" deseninde kullanılan yapılar ile aynıdır. Bu iki desen arasında çok küçük farklılıklar vardır. Bu farkları ilerleyen kısımlarda açıklayacağım.
"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 istemci programın çalışmasını hiç bir şekilde etkilemeyecektir. Burda dikkat edilmesi gereken nokta ise şudur : bu desen kompleks nesneyi oluşturan yapıların gerçek nesneden tamamen bağımsız bir yapıda olduğu durumlarda kullanıldığı zaman esneklik getirecektir. Dolayısıyla her bir farklı parçanın kompleks nesnede kullanılması, kompleks nesnenin işlevini değiştirmeyeceği gibi sadece görünümünü yada tipini değiştirecektir.
Builder deseninin Abstract Factory deseninden farkına gelince; "Abstract Factory" deseninde soyut fabrika olarak bilinen yapının metotları fabrikaya ait nesnelerin yaratılmasından bizzat sorumludur. Builder deseninde ise aynı mekanizma biraz daha farklı işlemektedir. Builder deseninde istemci modülü, nesnelerin ne şekilde oluşturulacağına soyut fabrika yapısına benzer bir yapı olan Builder yapısının metotları ile
karar verir ve istemci oluşturulan bu nesneyi Builder sınıfından tekrar talep eder.
Yukarıdaki soyut açıklamalardan sonra daha gerçekçi bir örnekle bu deseni açıklamamın sizin ruh haliniz açısından faydalı olacağını düşünüyorum. Farklı donanım ürünlerinin biraraya getirilerek bilgisayar sistemlerinin oluşturulduğu bir teknik servisi göz önünde bulunduralım. Bir müşteri bu servise gelerek çeşitli özellikleri içinde barındıran bir bilgisayar talep eder. İsteği alan servis temsilcisi bu isteği teknik birimlere iletir ardından teknik eleman istenilen özelliklerde bir bilgisayarın oluşması için gerekli donanımları raflarından alır ve birleştirir. Sonuçta müşterinin isteği yerine gelir ve karşılıklı bir mutluluk havası içine girilir. Tabi bizi ilgilendirin müşterinin ve satıcının mutluluğu değil elbette. Bizi ilgilendiren nokta müşterinin bilgisayarı oluşturuan parçaların birleştirilmesinden tamamen soyutlandığıdır. Dikkat ederseniz verilen özelliklerde bilgisayarın oluşmasında müşterinin hiç bir etkisi olmamıştır. Eğer müşteri son anda vazgeçip farklı özelliklerde bir bilgisayar istemiş olsaydı yine bir etkisi olmayacaktı. Bu durumda eski bilgisayarın ilgili parçaları değiştirilip yeni isteğe uygun parçalar takılacaktı. Burda da kompleks bir yapı olan bilgisayar sisteminin kendisini oluşturan parçalardan (donanım) tamamen bağımsız bir yapıda olduğunu görüyoruz. Herhangi bir diskin yada monitörün değişmesi bilgisayarı bilgisayar yapmaktan çıkarmayacak sadece bilgisayarın tipini ve görüntüsünü değiştirecektir. Bu durum bizim yukarıda açıkladığımız builder deseninin amacına tam olarak uymaktadır. Zira birazdan bir teknik servisteki bu işleri otomatize eden temel desenimizi C# ile nasıl gerçekleştirebileceğimizi göreceğiz.
Builder desenin de temel olarak 4 yapı bulunmaktadır. Bu yapılar sırasıyla şöyledir :
"Builder" Arayüzü
: Bu yapı içinde gerçek/somut(concrete) Builder sınıflarının uygulaması gereken özellikleri ve metotları barındırır. "Builder" abstract bir sınıf olabileceği gibi bir arayüz de olabilir. En çok tercih edilen yapı arayüz olmasına rağmen uygulamanızın ihtiyacına göre abstract sınıflarıda kullanabilirsiniz. Gerçek örneğimizde bu yapı bir bilgisayar sisteminin minimum olarak uygulaması gereken özellikleri temsil eder. Örneğin kullanıcılara satılacak her bilgisayar sistemi mutlaka HDD,RAM gibi yapıları içerisinde bulundurmalıdır. Dolayısıyla birbirinden farklı bilgisayar sistemlerinin bu tür yapıları mutlak olarak içerisinde barındırabilmesi için zorlayıcı bir etkene diğer bir değişle abstract üye elemanlara yada arayüzlere ihtiyacımız vardır.
"Concrete(Somut) Builder" Yapısı
: Gerçek bir bilgisayar sistemini temsil eden ana yapımızdır. Farklı farklı donanımların bir araya getirilmesi ile çok sayıda sistem oluşturulabilir. Oluşturulabilecek her sistem gerçek bir Builder yapısına denk düşmektedir.
Product(Ürün)
: Gerçek bir bilgisayar sistemini ve bu sistemde hangi özelliklerin bulunduğunu somut olarak yapısında barındıran bir modeldir. Bu noktada bir önceki Concrete Builder yapısının parçaları oluşturduğunu, bu parçaların birleşmesinden oluşan kompleks nesneninde Product olduğunu belirtmekte yarar var.
Director(Yönetici)
: Genellikle istemci ile yani örneğimizdeki müşteri ile Builder(parçaları birleştirip ürün yapan birimler) yapıları arasında köprü görevinde bulunan yapı olarak bilinir. Kısacası bilgisayar sisteminin oluşması için raflardan donanımları alıp onları birleştiren teknik eleman Director görevindedir. Tabi Director yapısının iş yaparken Builder arayüzünün kısıtlarına göre çalışması gerektiğinide belirtmek gerekir.
UML Modeli
Aşağıdaki şekil "Builder" tasarım deseninin UML sınıf diagramını göstermektedir. Şemadaki her bir şekil desendeki iligili yapıyı modellemektedir. Ayrıca desendeki sınıflar arasındaki ilişkilerde detaylı bir şekilde gösterilmiştir.
Yukarıdaki UML diyagramını kısaca özetleyecek olursak : Builder arayüzünde bulunan metotlar yardımıyla gerçek builder sınıflarında kompleks nesnenin parçaları birleştirilerek istenilen nesne oluşturulur. Kompleks sistemi oluşturan parçalar farklı sayılarda olabildği halde minumum gereklilikleri de sağlamak zorundadır. Bu minumum gereksinimler Builder arayüzünde bildirilmiştir. Director sınıfındaki bir metot, her sistem için standart olan Builder arayüzündeki metotları kullanarak hangi sistemin oluşturulduğundan bağımsız olarak kompleks nesnenin oluşturulması sağlanır. Yani Director hangi tür bir bir bilgisayar sisteminin oluşturulacağı ile ilgilenmez. Director sınıfı sadece kendisine gönderilen parametre sayesinde Builder arayüzünün metotlarından haberdardır. Son olarak istemci Director sınıfının ilgili metotlarını kullanarak gerçek ürünün oluşmasını sağlar. Bunun için elbette Director sınıfının ilgili metoduna hangi ürünün oluşturulacağını bildirmesi gerekir.
Bu kısa açıklamadan sonra yukarıdaki diyagramı baz alarak modern bir programlama dili olan C# ile bu deseni nasıl gerçekleştirebileceğimizi inceleyelim.
Builder Deseninin C# ile Gerçekleştirilmesi
! Aşağıdaki kodları kısaca inceleyip açıklamaları okumaya devam edin.
using System; namespace BuilderPattern
{
public interface IBilgisayarToplayicisi
{
Bilgisayar Bilgisayar{get;}
void CDROM_Olustur();
void HDD_Olustur();
void Monitor_Olustur();
void RAM_Olustur();
}
public class GoldPC : IBilgisayarToplayicisi
{
private Bilgisayar mBilgisayar;
public Bilgisayar Bilgisayar
{
get{return mBilgisayar;}
}
public GoldPC()
{
mBilgisayar = new Bilgisayar("Gold-PC");
}
public void CDROM_Olustur()
{
mBilgisayar["cdrom"] = "52X GoldStar";
}
public void HDD_Olustur()
{
mBilgisayar["hdd"] = "60 GB Seagate";
}
public void Monitor_Olustur()
{
mBilgisayar["monitor"] = "17' Hyundai";
}
public void RAM_Olustur()
{
mBilgisayar["ram"] = "512 MB DDR Kingston";
}
}
public class SilverPC : IBilgisayarToplayicisi
{
private Bilgisayar mBilgisayar;
public Bilgisayar Bilgisayar
{
get{return mBilgisayar;}
}
public SilverPC()
{
mBilgisayar = new Bilgisayar("Silver-PC");
}
public void CDROM_Olustur()
{
mBilgisayar["cdrom"] = "48X Creative";
}
public void HDD_Olustur()
{
mBilgisayar["hdd"] = "30 GB Maxtor";
}
public void Monitor_Olustur()
{
mBilgisayar["monitor"] = "15' Vestel";
}
public void RAM_Olustur()
{
mBilgisayar["ram"] = "256 MB SD Kingston";
}
}
public class Bilgisayar
{
private string mBilgisayarTipi;
private System.Collections.Hashtable mParcalar = new System.Collections.Hashtable();
public Bilgisayar(string BilgisayarTipi)
{
mBilgisayarTipi = BilgisayarTipi;
}
public object this[string key]
{
get
{
return mParcalar[key];
}
set
{
mParcalar[key] = value;
}
}
public void BilgisayariGoster()
{
Console.WriteLine("Bilgisayar Tipi : " + mBilgisayarTipi);
Console.WriteLine("---> CD-ROM Model : " + mParcalar["cdrom"]);
Console.WriteLine("---> Hard Disk Model : " + mParcalar["hdd"]);
Console.WriteLine("---> Monitör Model : " + mParcalar["monitor"]);
Console.WriteLine("---> RAM Model : " + mParcalar["ram"]);
}
}
public class TeknikServis
{
public void BilgisayarTopla(IBilgisayarToplayicisi bilgisayarToplayicisi)
{
bilgisayarToplayicisi.CDROM_Olustur();
bilgisayarToplayicisi.HDD_Olustur();
bilgisayarToplayicisi.Monitor_Olustur();
bilgisayarToplayicisi.RAM_Olustur();
}
}
}
Kaynak koddan da görüleceği üzere en temel yapımız IBilgisayarToplayicisi arayüzüdür. Bu arayüzde bir Bilgisayar ürününü temsil etmek için bir özellik ve bilgisayarı oluşturan parçaları oluşturmak için gereken metotlar bulunmaktadır. Bu metotların bu arayüzden türeyen bütün sınıflar tarafından uygulanması gerekmektedir. Örneğimizde bir GoldPC ve SilverPC bilgisayar modelleri için gereken bileşenleri oluşturmak için 4 adet metot bulunmaktadır. Burada en önemli nokta her Bilgisayar tipinde bir özelliğinde bulunması. Bu özellik istendiği zaman oluşturulan Bilgisayar ürününü istemciye vermektedir. Zaten dikkat ederseniz her bir sisteme ilişikin özellikler Bilgisayar sınıfındaki Hashtable nesnesinde saklanmıştır. Ayrıca her Bilgisayar nesnesinin ayrıca bir tip bilgisi saklanmaktadır. Son olarak TeknikServis isimli sınıfımızı ele alalım. Bu sınıf Builder desenindeki Director yapısına denk düşmektedir. Bu sınıftaki BilgisayarTopla metodu kendisine gönderilen bilgisayartoplayıcısı arayüzü referansına ait metotları kullanarak Bilgisayar nesnesinin parçalarını kendisi oluşturmaktadır. Bu örnekte bilgisayarı oluşturan her parça kafa karıştırmamak için ayrı bir sınıf olarak tasarlanmamıştır. Bunun yerine string türünden değerlere sahip olan bir hashtable nesnesi kullanılmıştır.
Not : Yukarıdaki örnek gerçek otomasyonda birebir kullanılamayabilir. Örneğin her bir bilgisayar modeli için ayrı ayrı sınıf tasarlamak hoş olmayabilir. Bu sorunu daha dinamik bir şekilde çözmek gerekir. Buradaki örnek sadece Builder desenin daha rahat bir şekilde kavrayabilmeniz için verilmiştir.
Son olarak yukarıdaki yapıları kullanan bir istemci programı yazıp desenimizi test edelim.
using System; namespace BuilderPattern
{
class Class1
{
static void Main(string[] args)
{
TeknikServis teknikservis = new TeknikServis();
IBilgisayarToplayicisi BT1 = new GoldPC();
IBilgisayarToplayicisi BT2 = new SilverPC();
tekniksevis.BilgisayarTopla(BT1);
teknikservis.BilgisayarTopla(BT2);
BT1.Bilgisayar.BilgisayariGoster();
Console.WriteLine("-------------");
BT2.Bilgisayar.BilgisayariGoster();
}
}
}
Programı çalıştırdığımızda aşağıdaki ekran görüntüsünü elde ederiz.
Bilgisayar Tipi : Gold-PC
---> CD-ROM Model : 52X GoldStar
---> Hard Disk Model : 60 GB Seagate
---> Monitör Model : 17' Hyundai
---> RAM Model : 512 MB DDR Kingston
-------------
Bilgisayar Tipi : Silver-PC
---> CD-ROM Model : 48X Creative
---> Hard Disk Model : 30 GB Maxtor
---> Monitör Model : 15' Vestel
---> RAM Model : 256 MB SD Kingston
Desenlerle ilgili bir sonraki yazımda Creational desenlerden olan "Prototype" desenini ele alacağım. Herkese iyi çalışmalar.
Makale:
"Builder" Tasarım Deseninin C# ile Gerçekleştirilmesi C#, Visual C# ve .NET Sefer Algan
Yazılan Yorumlar
Yorum Yaz
ŞUB
22
2005
adem gidici
/
üye hakkında
Bu tasarım kalıbını kullanarak kodlarımızı yazarsak nasıl bir fayda elde edeceğiz. Pratik kullanım yerleri nerelerdir. Teşekürler
OCA
28
2004
test deneme
/
üye hakkında
Şunu sormak istiyorum, UML Modelinde Builder Arayüzü ile Director arasındaki ilişkiyi tanımlayan ilişki nedir, yani o çizgi ne ifade ediyor, bir ucu aggregation ilişkisini temsil eden, diğer ucu ok olan. Yardımlarınız için çok teşekkürler.
Sayfalar :
1
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için
tıklayın
.
Üye değilseniz
Üyel Ol
linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
Bu Konuda Son 10
Eklenen Son 10
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl