Mehmet Ethem SULAN :: Java Tasarım Şablonları :: Tasarım Şablonları Nedir ve Neden Kullanılır(Factory, Prototype, Abstarct Factory, Singletion, Builder, Facade, Decorator, Adapter, Bridge, Composite, Flyweight, Proxy, Command, Iterator, Chain-of Responsibility, Strategy, Visitor, Template, Memento, Observer, Mediator, State, Interpreter)

Tsarım şablonu nedir

Yazılımcıların tecrübeleri sonucu ortaya çıkan ve 
belirli problemleri çözmede etkili olan ve tekrar 
kullanılabilen kalıplardır. Genelde interface 
veya abstract class kullanılır. 

Oluşturucu Tasarım Kalıpları

1. Factory(Fabrika)

Soyut olarak tanımlanmış sınıflardan nesn
e oluşturabilmek için kullanılır. Frameworklerde
 kullanılır. Nesneler arası ilişkiler tanımlamak 
için soyut sınıflar frameworklerde kullanmak zorundadır.
 Bu sınıflardan new ile nesne oluşturmayı 
fabrika şablonun amacıdır. Verilen parametreye 
göre nesne oluşturur. Nasıl oluşturulduğuyla ilgilenmiyor.

2. Prototype(Prototipe)

Birebir clonlıyoruz. Kopyasını aldıktan sonra
 istediğimiz özelliği değiştiririz. New ile yeni
 nesne türetme fazla iş getirdiği durumlarda bunu
 kullanırız. Eğer sistem çok karmaşıksa nesne türetmek
 yerine kopyasını almak daha avantajlıdır. Bunun için
 cloneable interfacesini implement etmek zorundayız.

3. Abstarct Factory(Soyut Fabrika)

Fabrika oluşturan bir fabrikadır. Birbiriyle ilişkili
 olan nesne grupları oluşturmada kullanılır. 
Bu kalıp sayesinde somut sınıflarda hakkında bilgimiz
 olmadan birbirleriyle ilgili ya da bağımlı nesneler oluşturabiliriz.

4. Singletion(Tekil)

Bir sınıftan sadece tek bir nesne 
oluşturulması ve tüm sistemin bu nesneyi 
kullanmasını sağlamak için kullanılır.

5. Builder(Inşaatçı)

Karmaşık bir nesnenin oluşturulmasıyla temsilini
 birbirinden ayırır. Böylece aynı oluşturma süreciyle
 farklı temsiller oluşturulabilir. Karmaşık nesneyi
 değişik parçaları bir araya getirilerek oluşturulur.
 Tıp kı inşaata kullanılan malzemelerin
 birleştirilmesinden binanın meydana gelmesi gibi.

 

Yapısal Tasarım Kalıpları

1. Facade(Ön Cephe)

Binaya bakınca ön yüzünü görüyoruz, içindekileri
 göremiyoruz. Facade bu içindeki karmaşık sistemi 
kullanarak bize basit bir kullanım sağlar. 
 Yani karmaşıklığı soyutlar ve biz de basit ara yüz 
ile işlemlerimizi gerçekleştiriyoruz. 

2. Decorator(Dekore Etmek-Yeniden Düzenlemek)

Var olanı düzenlemeyi amaçlar. Örneğin bir evimiz
 var ve evin içini düzenliyoruz. Yeniden ev 
yapmıyoruz sadece var olan evi düzenliyoruz.

< br />

3. Adapter(Adapte Etme)

Sınıfların metotlarını istediğimiz bir şekle 
adapte etmektir. Yani var olan bir sınıfın ara
 yüzünü(metotlarını)  bu sınıfı kullanmak isteyen
 kişinin istediği bir ara yüze dönüştürmektir.

4. Bridge(Köprü)

Bir sınıfın ara yüzünü gerçekleştiriminden ayırmak 
için kullanılır. Böylece ikisi de ayrı ayrı yapılabilir.
 Bir sınıfın yapacağı işler belirli ise fakat aynı 
iş farklı sistemlerde farklı farklı yapılacaksa
 bu şablon kullanılır. Örneğin bir uygulama 
hem Linux hem de windowsta çalışabilmesi bu
 şablonun kullanması lazım.

5. Composite(Kompozit)

Composit nesneleri bir ağaç yapısı şeklinde birleştirmek
 için kullanılır. Bir parça-bütün ilişkisi sunar.
 Bir nesne içinde bir veya birden fazla aynı tip 
nesne tutar ve bu nesnelerin her birinde aynı 
şekilde bir veya birden fazla nesne tutabilir.
 Yani bir sistemin bütünü ve parçaları arasındaki 
ilişkiler modellemek için kullanılır. Sistemin 
bütününü oluşturan parçalar, kendi içlerinden alt
 parçalardan oluşabilir. Composite kullanıcı sınıfın,
 sistem, sistemin parçaları ve alt parçalar arasında
 ayrım yapmadan nesneleri kullanmasına izin veriri. 
Bu şekilde sistemin kullanımı ve yazılımı
 daha sadeleştirilmiş olur.

6. Flyweight

Basit nesneler oluşturmak istiyorsanız ve bu nesnelerin
 bazı veri değerleri farklıysa bu şablon kullanılır.
 Nesnelerden çok fazla üretmek yerine bir tane oluşturup,
 farklı veri değerlerini paratmetre olarak göndermek
 avantajlı olur. Mesela aaa, bbb her bir a veya b için
 farklı nesneler üretmek yerine aynı harfler için
 tek nesne türeterek sadece konumları farklı olanı 
bir metot parametresiyle aynı nesneyi çağırarak
 harfi bastır. Örneğin kelime işleme uygulamasındaki
 her harf için bir nesne oluşturmaktansa harfin bir
 kopyası oluşturulur ve kullanılacağı 
yerde bu kopyanın referansı kullanılır.

7. Proxy(vekil)

Proxy nesnesi karmaşık bir nesneyi basit bir 
nesne olarak sunmak amacıyla kullanılır.
 Gerçek nesneye ihtiyaç duyulmayana  kadar oluşturulmaz.
 Bunun yerine Proxy nesnesi kullanılır. Gerçek nesneye
 ihtiyaç duyulana kadar durumu idare eder. Eğer bir 

nesneyi oluşturmak çok zaman veya kaynak(bellek, işlemci..)

 gerektiriyorsa, Proxy nesnesi bu oluşturmayı 
size gerçek nesneye ihtiyaç duyana kadar erteler. 
Karmaşık nesneden bir tane oluşturulur, karmaşık 
nesneye referans içeren Proxy nesneleri oluşturulur.
 Bu Proxy nesnelerine yapılan çağrılar asıl karmaşık
 nesneye yönlendirilir. Bu şekilde bir karmaşık 
nesne ve bu nesne gibi davranan Proxy nesneleri olur.

Davranışsal Tasarım Kalıpları

1. Command(Komut)

Yapılacak her bir işi sadece bir nesneyle
 ilişkilendirerek farklı işleri farklı nesnelerle
 yapmaktır. Yani bir nesne sadece bir iş yapsın.
 Mesela yazdırma işini sadece bir nesneyle ilişkilendiririz.
 Bu nesne yazdırma işiyle alakalı bilgileri 
kendi içinde tutar. Bu avantaj sağlar. Bir işi 
direkt nesne ile ilişkilendirince işle ilgili 
diğer bilgiler de nesne içinde tutulur. Örneğin word
 belgesine bir şey yazdık ve Ctrl+Z ile geri aldık.
 Bu işlem komut nesnesiyle sağlanılır. Macro video 
kaydı gibidir. Yapılan işlemleri kaydeder. 
Çalıştırınca sırayla gösterir. Commandın temel amacı 
yapılacak işleri nesnelere bölmektir. 

2. Iterator(Tekrarlayıcı)

Bir koleksiyon tipli nesnelerin içerisindeki 
elemanlara bu koleksiyonun iç yapısını bilmeden
 sıralı olarak erişmek için kullanılır. Örneğin
 bir ArrayList kullanınca ArrayList’e ait get()
 metodunu bilmemiz lazım. Ama iterator şablonu 
ile bu get() metodunu bilmeden sırayla elemanlara
 erişebiliriz. Avantajı Collection’un iç yapısını
( her bir veri tipine özel metodları mesela list 
için get(), stack için put()) bilmemize gerek kalmıyor.

3. Chain-of Responsibility

Bunu kullanan sınıflar bağlı liste şeklinde bağlılar. 
Örneğin kulaktan kulağa oynanan oyun gibi. Bir istek
 birden fazla kişi tarafından işlenecekse ve hangileri 
işleyeceği belli olmadığı durumlarda kullanılır. 
Bir mesajım var ve herkese iletiyorum ama o mesaj kimi
 ilgilendirirse o alıp ona göre işlem yapar. Mesela bir
 seçmeli ders yok. Bu bilgiyi 3.sınıf öğrencilerin
 hepsine yolluyorum ama ders seçmeli olduğundan 
sadece o dersi alan okula gelmez. Diğer öğrencileri
 bağlamıyor. İkinci bir kullanımı ise bir işe yapılacak
 ama kimin yaptığı önemli değil. Mesela çöp dökülecek 

birinin dökmesi lazım. Bir kişi çöpü döktüğünde iş biter.
 Kimin çöpü döktüğü önemli değil. Sadece çöpü 
dökme işlemi gerçekleşmesi önemlidir.

4. Strategy(Strateji)

Birçok sıralama algoritmasından strateji kalıbı ile
 içlerinden istediğimizi kullanmamızı sağlar. 
Algoritmaları sınıfın içinde yazmak yerine bu şablonda yazılır.
 Esneklik sağlar. Aksi halde hangi algoritmayı 
kullanacağımızı sınıfın içinde tanımlamalıyız. 
Eğer kullanacağımız algoritma belli değilse bir sürü 
algoritma sınıfın içinde tanımlamak zorunda kalırız. 

5. Visitor(Ziyaretçi)

Sınıf hiyerarşisini bozmadan bazı sınıflara yeni
 metot eklemeyi sağlar. Decoratorda mevcut olanı düzenliyoruz.
 Ama visitorda yeni metot ekliyoruz. Ziyaret 
edileceği kişiye özel olduğundan somuttur. 
Ikinci bir kullanımı ise sende olmayan bir özellik
 senin için biri yapıyor. Yani sen bir şeyi yapmayı 
bilmiyorsun biri gelip senin için o işi yapıyor.

6. Template(Şablon)

A sınıfı B sınıfından bazı şeyleri yapmasını istiyor.
 Fakat A B nin nasıl yaptığını bilmeyecek.
Örneğin sınıfta herkes Java bilecek. Fakat nasıl
 öğreneceksen öğren hocayı ilgilendirmez. 

7. Memento

Bir nesneyi, daha önce sahip olduğu bir duruma
 tekrar dönüştürebilmek için kullanılır.
 Örneğin word belgesinde geri al Ctrl + Z gibi.
 Command memento içinde kullanılır.

8. Observer(Gözlemci)

Genelde (üye ol/yayınla) programındaki bir nesnenin 
durumunu takip etmek için kullanılır. Takip ve haber
 verme şablonudur. Nesnenin durumunda bir değişiklik
 olduğunda bize haber verir. Böylece sürekli nesneyi 
gidip acaba durumunda değişiklik oldu mu diye kontrol
 etmeye gerek kalmıyor. Bütün observerlar aynı metod 
ismine sahiptir. Mesela buton tıklandığında kendisi
 bana haber verir. Yani içindeki kodları çalıştırır. 
Ben sürekli gidip tıklanıp tıklanmadığını kontrol etmiyorum.

9. Mediator(Arabulucu)

Uygulamadaki çeşitli sınıfların birbirleriyle
 iletişim kurmasını sağlayan bir nesnedir.
 Amacı arabuluculuk yapmaktır. Mesela uçaklar inip 
kalkışta sadece kulelerle iletişime geçerler.
 Uçaklar birbiriyle haberleşmezler bu durumda. 
Diğer bir örnek msn sunucusu.  Birden fazla nesnem var
 birbiriyle mesajlaşmak istiyor. Bunu sunucu düzenliyor. 
Direkt kullanıcılar birbiriyle iletişime geçemiyor. 
Sunucu bu iletişimi sağlıyor.

10. State(Durum)

State kalıbını kullanarak bir nesnenin davranışı, 
sahip olduğu değerler değiştiği zaman değiştirilebilir.
 Bu durum sanki nesne sahip olduğu sınıf değiştirilmiş olur.
 Bir nesnenin sahip olduğu duruma göre(değişkenlerin değeri) 
davranışını(sahip olduğu metotlar) değiştirilebilir bu kalıpla.

11. Interpreter(Yorumlayıcı)

Verilen bir dilin sunumu ve yorumlanması için kullanılır.
 Bu şablon dildeki gramer kuraların her biri için 
bir sınıf kullanır. Genelde özel amaçlı bir dil 
tasarımı ve yorumlamasında kullanılır. 
 
Bütün tasarım kalıpları esneklik sağlıyor.

Comments

There is one comment for this post.

  1. Tayfur Yilmaz on Ağustos 18, 2010 4:30 pm

    design patterns dersinde gordugumuz tüm tasarım desenlerini java kodlari ile açıklamışsın süpersin ethem bi de bunun python versiyonunu yapsan tadından yenmeyecek 🙂

Write a Comment

Let me know what you think?