Archive for the ‘ Java Tasarım Şablonları ’ Category

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.

observer

Uml diagramın daha büyük resmi:http://prntscr.com/akm0

Takip ve haber vermede kullanılır.Nesnenin durumunda bir değişiklik olunca bizi haberdar eder.Bir çok uygulama bunu kullanır.Mesela olay algılıyıcıları button tıklandığındığında gerçekleşecek olay gibi.Sürekli bir nesneyi dinlemek yerine nesnenin durumunda bir değişilik olduğunda bize bildirmesini daha iyidir.Eğer sürekli bir nesneyi dinleme alırsak mesela her sn başı buttonun tıklanıp tıklanmadığını kontrol etmek yerine button tıklandığında bize haber vermesini isteriz.Bize haber vermesinden kasıt buttonun içine button tıklandığında gerçekleştirmek istediğimiz kodu yazarız.Ya da bu örnekte olduğu gibi bir topluluk var ve arada bir bütün üyelere mail atılır.Her sefer üyelerin gidip grubu kontrol etmesine gerek yok.Gruba mail atıldığında otomatik olarak grup üyelerine de gelir mesajlar.Başka örnek bir dergiye aboneyiz her hafta telefon açıp derginiz çıktı mı acaba demek yerine dergi çıktığında onların bizi arayıp derginiz hazır buyrun alabilirsiniz şeklinde bir çok uygulama da kullanılır.Java da bu şablon için sınıf ve arayüz vardır.

package www.ethemsulan.com;
import java.util.Observable;
import javax.swing.JOptionPane;
public class OlayKaynagi extends Observable{
public void uyelerDinlemede() {
	boolean kontrol=true;
	String mesajYolla;
	while (kontrol) {
mesajYolla=JOptionPane.showInputDialog("Mesaj yaz");
if("".equals(mesajYolla) || mesajYolla==null){
	kontrol=false;
}else{
	setChanged();
	notifyObservers(mesajYolla);
			}
		}
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/04zSGBeN

package www.ethemsulan.com;
import java.util.Observable;
import java.util.Observer;
public class GercekOlayYonet implements Observer {
	private String girilenDeger;
public void update(Observable arg0, Object arg1) {
if(arg1 instanceof String){
	girilenDeger=(String)arg1;
System.out.println("Topluluk uyelerine " +
		"mail gonderildi:"+girilenDeger);
		}	
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/GaHZ19q8

package www.ethemsulan.com;
public class TestSinifi {
	public static void main(String[] args) {
	OlayKaynagi kaynak=new OlayKaynagi();
	GercekOlayYonet olay=new GercekOlayYonet();
		kaynak.addObserver(olay);
		kaynak.uyelerDinlemede();
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/Pryvq9Av

decorator

UML diagramin daha büyük resmi:http://prntscr.com/9vb4

package www.ethemsulan.com;
public interface Bilgisayar {
	public void tamirEt();
}

Orj kod:http://www.ethemsulan.pastebin.com/wNF0a9Pp

package www.ethemsulan.com;
public class MasaustuBilg implements Bilgisayar {
public void tamirEt() {
System.out.println("Tamir etmek icin bilgisayar alindi");
  }
}

Orj kod:http://www.ethemsulan.pastebin.com/pAiLfxZV

package www.ethemsulan.com;
//Nesne oluşturuluyor ve bu nesne üzerinde değişikler
//gerçekleştiriliyor.Decorator kalıbı bize nesneyi
//istediğimiz şekilde düzenlememizi sağlıyor.
//Bu interfaceyi imlemente eder ama soyut olduğu için
//interface içindeki metodu tanımlamayabilir.
public abstract class BilgisayarDecorator implements Bilgisayar {
private Bilgisayar tamEdilBilg=new MasaustuBilg();
public Bilgisayar getTamEdilBilg() {
		return tamEdilBilg;
	}
public void setTamEdilBilg(Bilgisayar tamEdilBilg) {
		this.tamEdilBilg = tamEdilBilg;
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/2qRTYvs3

package www.ethemsulan.com;
public class MonitorDegistir extends BilgisayarDecorator {
public void tamirEt() {
 getTamEdilBilg().tamirEt();
 System.out.println(monitorYenile());
	}
private String monitorYenile(){
return "Monitörünüz LCD monitör olarak değiştirildi";
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/sSZeShe2

package www.ethemsulan.com;
public class TvKartiEkle extends BilgisayarDecorator {
public void tamirEt() {
	getTamEdilBilg().tamirEt();	
	System.out.println(eklenenTvKarti());
	}
private String eklenenTvKarti(){
return "Bilgisayariniza Uydusal Yayın Uyumlu TV karti eklendi.";
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/ExB4RtFF

package www.ethemsulan.com;
public class TestSinifi {
public static void main(String[] args) {
Bilgisayar monNesnem=new MonitorDegistir();
	monNesnem.tamirEt();
	monNesnem=new TvKartiEkle();
	monNesnem.tamirEt();
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/ekZRA3fe

Decorator isminden de anlaşıldığı gibi decore etmek.Yani yeniden düzenlemek eksikleri giderme ya da yeni özellikler eklemektir.Decorator tasarım kalıbı da var olan sistem ya da nesneler üzerine yeni özellikler eklemek için kullanılır.Nesnemiz sabit nesne üzerine yeni özellikler ekliyoruz.Yeniden nesne oluşturmuyoruz.Var olanı kullanıyoruz.Yukarda verilen örnekte temel olarak bir bilgisayarımız var biz o bilgisayara yeni parça ekleme ya da eskimiş parçalarını değiştirme işelmini gerçekleştiriyoruz.

Image00001

Uml diagram:http://prntscr.com/755x

Composite tasarım kalıbı nesnelerde parça-bütün ilşkisini sağlar.Bu sistem,sistemin alt parçalarını kullanıma izin verdiği için sistemin yazımı ve kullanımı kolaylaşır.Nesneleri bir ağaç yapısı şeklinde tutar.Örnekte anlaışldığı gibi bir BWM var ve bunna ait parçalar var.Biz bu parçalara eriştiğimiz gibi onları birleştirerek sistemin bütünü oluşturuyoruz.Bir yapıyı oluşturan nesneler topluluğunda yapıyı oluşturan parçaları tree(ağaç) şeklinde tutar.

package www.ethemsulan.com;
public interface BMWParca {
	public void seriNo();
}

Orj kod:http://www.ethemsulan.pastebin.com/034xJwxC

package www.ethemsulan.com;
public class Fren implements BMWParca {
private static String frenSeriNo="F34";
public static String getFrenSeriNo() {
		return frenSeriNo;
	}
public static void setFrenSeriNo(String frenSeriNo) {
		Fren.frenSeriNo = frenSeriNo;
	}
public void seriNo() {
System.out.println("Fren seri no: "+getFrenSeriNo());
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/eZydPpiG

package www.ethemsulan.com;
public class Debriyaj implements BMWParca {
private static String debriyajSeriNo="D21";
public static String getDebriyajSeriNo() {
		return debriyajSeriNo;
	}
public static void setDebriyajSeriNo(String debriyajSeriNo) {
	Debriyaj.debriyajSeriNo = debriyajSeriNo;
	}
public void seriNo() {
System.out.println("Debriyaj seri no : "+getDebriyajSeriNo());
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/FCxxJ5rq

package www.ethemsulan.com;
public class Balata implements BMWParca {
private static String balataSeriNo="B17";
public static String getBalataSeriNo() {
		return balataSeriNo;
	}
public static void setBalataSeriNo(String balataSeriNo) {
	Balata.balataSeriNo = balataSeriNo;
	}
public void seriNo() {
System.out.println("Balata seri no : "+getBalataSeriNo());
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/054mvYQF

package www.ethemsulan.com;
import java.util.LinkedList;
public class BMW implements BMWParca {
private LinkedList listem=
	new LinkedList();
public LinkedList getListem() {
		return listem;
	}
public void setListem(LinkedList listem) {
		this.listem = listem;
	}
public void parcaEkle(BMWParca istenenParca){
		getListem().add(istenenParca);
	}
public String parcaDegistir(BMWParca eskiParca,
BMWParca yeniParca, String hangiParca,String yeniSeriNo){
  if(getListem().contains(eskiParca)){
	if(hangiParca.equals("Fren")){
		getListem().remove(eskiParca);
		getListem().add(yeniParca);
	Fren.setFrenSeriNo(yeniSeriNo);
return "Fren seri no : "+yeniSeriNo+" olarak degistirildi";
	}else if(hangiParca.equals("Debriyaj")){
		getListem().remove(eskiParca);
		getListem().add(yeniParca);
	Debriyaj.setDebriyajSeriNo(yeniSeriNo);
return "Debriyaj seri no: "+yeniSeriNo+" olarak degistirildi";
	}else if(hangiParca.equals("Balata")){
		getListem().remove(eskiParca);
		getListem().add(yeniParca);
	Balata.setBalataSeriNo(yeniSeriNo);
return "Balata seri no:"+yeniSeriNo+" olarak degistirildi";
			}
		}
return "Girilen deger Balata, Fren, Debriyaj isimlerini icermeli";
	}
public void seriNo() {
		new Fren().seriNo();
		new Debriyaj().seriNo();
		new Balata().seriNo();
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/h8FU1JVt

package www.ethemsulan.com;
public class TestSinifim {
public static void main(String[] args) {
	BMW bmwNesnem=new BMW();
	BMWParca fren1=new Fren();
	bmwNesnem.parcaEkle(fren1);
BMWParca debriyaj1=new Debriyaj();
	bmwNesnem.parcaEkle(debriyaj1);
	BMWParca balata1=new Balata();
	bmwNesnem.parcaEkle(balata1);
	BMWParca fren2=new Fren();
	bmwNesnem.seriNo();
System.out.println(bmwNesnem.parcaDegistir(
		fren1, fren2, "Fren", "F99"));
	BMWParca balata2=new Balata();
System.out.println(bmwNesnem.parcaDegistir(
balata1, balata2, "Yanlis parca secildi", "B77"));
	bmwNesnem.seriNo();
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/GsdtpJQJ

facade
Uml diagram:http://prntscr.com/6zve

Büyük sistemlerde bir çok kişi farklı bileşenlerde çalışır.Bu bileşenlerin dış dünyaya açılan bir basit kapıları olur.Bunun üzerinden iletişim sağlanır.Katmanlı mimarilerde de böyledir.katmanalr arası izolasyonu sağlar.Tıpkı farklı ekiplerin aynı projede birbirinden bağımsız çalışmaları gibi.Işte bu tür komplex yapıların içeriğini soyutlayıp basit bir arayüzle dışa açılmasını bu kalıbla sağlarız.Bir bina düşünelim.Binaya bakınca dış görnümü görürüz, içteki kabloları,taş,beton… karmaşıklığı göremiyoruz.Facade içteki bu karmaşıklığı soyutlar ve basit bir kullanım bize sağlar.Örneğin Java da JDBC bir facadedir.Veritabanına bağlanırken arka planda neler olup bittiğini bilemiyoruz ve bilmemizde gerekmez.Yazdığım örnektede kullanıcı ad ve parola girip enterliyor.Arka planda yapılan kontroller soyutlanmış.Biz sadece değerleri giriyoruz doğru ise doğru yanlış ise yanlış sonuç geriye dönderir.Mesela bir bankaya kredi çekmek isteyen bir müşteri gelince bilgiler girer arka planda bu müşterinin kredi alabilir durumda olması kontrol ediliyor.Ama bu tür işlemler soyutlanır.

package www.ethemsulan.com;
public interface Arayuzumuz {
public String kulAd(String ad);
public String parola(String parola);
}

Orj kod:http://www.ethemsulan.pastebin.com/f1y3faQw

package www.ethemsulan.com;
public class Fabrikamiz implements Arayuzumuz{
public String kulAd(String ad) {
return new KontrolYap().ad(ad);
	}
public String parola(String parola) {
return new KontrolYap().par(parola);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/06WGkZnc

package www.ethemsulan.com;
public class KontrolYap {
public String ad(String ad) {
	if(ad.equals("ethem")){
		return " dogru kullanici adi";
		}
		return " yanlis kullanici adi";
	}
public String par(String parola) {
	if(parola.equals("sulan")){
			return " dogru parola";
		}
		return " yanlis parola";
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/t88ibBDh

package www.ethemsulan.com;

public class KullaniciSinif {
 Fabrikamiz fabNes=new Fabrikamiz();
 private String kulAd;
 private String parola;
 public String getKulAd() {
 return kulAd;
 }
 public void setKulAd(String kulAd) {
 this.kulAd = kulAd;
 }
 public String getParola() {
 return parola;
 }
 public void setParola(String parola) {
 this.parola = parola;
 }
 public KullaniciSinif(String ad, String parola){
 setKulAd(ad);
 setParola(parola);
 }
 public void dogruMu(){
 System.out.println("Girilen "+getKulAd()+fabNes.kulAd(getKulAd()));
 System.out.println("Girilen "+getParola()+fabNes.parola(getParola()));
 }
}
Orj kod:http://www.ethemsulan.pastebin.com/NdsbhAFj
package www.ethemsulan.com;
public class TestSinifi {
public static void main(String[] args) {
KullaniciSinif kulAdParola=
	new KullaniciSinif("ethem", "sulan");
	kulAdParola.dogruMu();
kulAdParola=new KullaniciSinif("mehmet", "duman");
	kulAdParola.dogruMu();
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/hUSQUa7W

Image00001

Uml diagram:http://prntscr.com/6xx1

Bir sınıfın arayüzünü implementasyonundan ayırmak için kullanılır.Bir sınıfın yapacağı işlemler belirlenmiş ise ve aynı işi farklı sistemlerde farklı yapılacaksa bu kalıp kullanılır.Bunu da adapter kalıbıyla farklı sistemlerde farklı şekilde kullanılmasını sağlayabiliriz.Köprü oluşumunda abstract factory kalıbı genelde kullanılır.Bu kalıp komplex sınıf yapıların oluşmasına engel olur.Bu da bize kontrolü bize verir.Yani bu şablonla kolay ve esnek yönetilebilir bir sistem sağlar bize.Karmaşık ve bakımı zor olan sistemlerin oluşumunu engeller.

package www.ethemsulan.com;
public abstract class FilmStok {
public abstract String filmSiparis(String f);
	private SiparisArayuzu sipNes;
public SiparisArayuzu getSipNes() {
		return sipNes;
	}
public void setSipNes(SiparisArayuzu sipNes) {
		this.sipNes = sipNes;
	}
public FilmStok(SiparisArayuzu sipNes) {
		super();
		setSipNes(sipNes);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/B9uwLvkq

package www.ethemsulan.com;
public interface SiparisArayuzu {
String maceraFilmSiparis(String f1);
String korkuFilmSiparis(String f2);
String komediFilmSiparis(String f3);
}

Orj kod:http://www.ethemsulan.pastebin.com/xCDraHra

package www.ethemsulan.com;
public class FilmUret1 implements SiparisArayuzu {
private FabrikaSonCikanFilmler yeniFilm=
	new FabrikaSonCikanFilmler();
public String komediFilmSiparis(String f3) {
return yeniFilm.komediSonCikFilmSiparis(f3);		
	}
public String korkuFilmSiparis(String f2) {
return yeniFilm.korkuSonCikFilmSiparis(f2);		
	}
public String maceraFilmSiparis(String f1) {
return yeniFilm.maceraSonCikFilmSiparis(f1);		
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/VvJHSr87

package www.ethemsulan.com;
public class FilmUret2 implements SiparisArayuzu {
private FabrikaEskiFilmler eskiFilm=new FabrikaEskiFilmler();
public String komediFilmSiparis(String f3) {
return eskiFilm.komediEskiFilmSiparis(f3);
	}
public String korkuFilmSiparis(String f2) {
return eskiFilm.korkuEskiFilmSiparis(f2);
	}
public String maceraFilmSiparis(String f1) {
return eskiFilm.maceraEskiFilmSiparis(f1);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/7VCcyuJv

package www.ethemsulan.com;
public class FabrikaSonCikanFilmler {
public String maceraSonCikFilmSiparis(String f1){
		return f1;
	}
public String korkuSonCikFilmSiparis(String f2){
		return f2;
	}
public String komediSonCikFilmSiparis(String f3){
		return f3;
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/fzzaNGze

package www.ethemsulan.com;
public class FabrikaEskiFilmler {
public String maceraEskiFilmSiparis(String f1){
		return f1;
	}
public String korkuEskiFilmSiparis(String f2){
		return f2;
	}
public String komediEskiFilmSiparis(String f3){
		return f3;
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/KgZkYJg4

package w
ww.ethemsulan.com;
public class Macera extends FilmStok {
public Macera(SiparisArayuzu sipNes){
		super(sipNes);
	}
public String filmSiparis(String f) {
		return maceraFilmSiparis(f);
	}
private String maceraFilmSiparis(String f) {
		return getSipNes().maceraFilmSiparis(f);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/B0d7WiuL

package www.ethemsulan.com;
public class Korku extends FilmStok {
public Korku(SiparisArayuzu sipNes2){
		super(sipNes2);
	}
public String filmSiparis(String f) {
		return korkuFilmSiparis(f);
	}
private String korkuFilmSiparis(String f) {
		return getSipNes().korkuFilmSiparis(f);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/uyua2D2F

package www.ethemsulan.com;
public class Komedi extends FilmStok {
public Komedi(SiparisArayuzu sipNes3){
		super(sipNes3);
	}
public String filmSiparis(String f) {
		return komediFilmSiparis(f);
	}
private String komediFilmSiparis(String f) {
		return getSipNes().komediFilmSiparis(f);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/kZ4F9Gwm

package www.ethemsulan.com;
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) {
FilmStok goster=new Macera(new FilmUret1());
String f=JOptionPane.showInputDialog("Yeni bir macera filmi gir");
System.out.println("Macera yeni film: "+goster.filmSiparis(f));
goster=new Macera(new FilmUret2());
f=JOptionPane.showInputDialog("Eski macera film gir");
System.out.println("Macera eski film: "+goster.filmSiparis(f));
goster=new Korku(new FilmUret1());
f=JOptionPane.showInputDialog("Yeni korku film gir");
System.out.println("Korku yeni film: "+goster.filmSiparis(f));
goster=new Korku(new FilmUret2());
f=JOptionPane.showInputDialog("Eski korku film gir");
System.out.println("Korku eski film: "+goster.filmSiparis(f));
goster=new Komedi(new FilmUret1());
f=JOptionPane.showInputDialog("Yeni komedi film gir");
System.out.println("Komedi yeni film: "+goster.filmSiparis(f));
goster=new Komedi(new FilmUret2());
f=JOptionPane.showInputDialog("Eski komedi film gir");
System.out.println("Komedi eski film: "+goster.filmSiparis(f));
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/mhuHfKcb

Bu şablon yardımıyla uygulamamızda birlikte çalışamayan sınıflar adapte edilerek birbiriyle çalışacak duruma getirilebilir.Bazen bir sınıfın kodu elimizde olamayacağı(.class sadece var elimizde) durumlarda bu şablon ile kendi sistemimize entegre edebilme imkanımız olur.Yanı kod elimizde değil ama biz kodu işimize yarayacak şekilde kullanabiliriz bu şablonla.Aslında kod elimizde olsa dahi bazen bazen değiştiremeyiz.Mesela bir metod birden fazla yerde kullanılıyordur sistemde.Onu değiştirmek yan etkilere sebep olabilir.Değiştirmek yerine istediğimiz şekle bu şablon ile bağdaştırabiliriz.Aşağıdaki örnekte claculatedField() yanı ingilizce isimli metodu Türkçe isim ile bağdaştırdım.alanHesapla() metoduna ingilizce olan metodu adapte ettim.

package www.ethemsulan.com;
public interface AlanHesaplaArayuzumuz {
//Ek bir bilgi interface içinde yazılan metodlarda
//abstract yazmazsak dahi arka planda abstracta çevirilir.
//public abstract int alanHesapla(int a,int b); arkaplanda bu şekle dönüştürülür.
//interface içindeki değer public ve abstract olarak otomatik dönüştürülür.
	int alanHesapla(int a,int b);	
}

Orj kod:http://www.ethemsulan.pastebin.com/HzMXRZnb

package www.ethemsulan.com;
public class Kare implements AlanHesaplaArayuzumuz{
	public int alanHesapla(int a, int b) {
		return a*b;
	}
}

orj kod:http://www.ethemsulan.pastebin.com/eZ2jHSsd

package www.ethemsulan.com;
public class DikUcgen implements AlanHesaplaArayuzumuz{
	public int alanHesapla(int a, int b) {
		return (a*b)/2;
	}
}

orj kod:http://www.ethemsulan.pastebin.com/myFuHDML

package www.ethemsulan.com;
public class Diktorgen {
//Bazen bir uygulamada metodlarımızın isimlerini ingilizceye 
//çevirmek zorunda kalabiliriz.Işlevi aynı ama metod isimleri
//değiştirmek için adapter yazabiliriz.
	public int calculatedField(int a,int b){
		return a*b;
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/TmGGNe34

package www.ethemsulan.com;
public class AdapterDikdortgen implements AlanHesaplaArayuzumuz{
	private Diktorgen nesnem=new Diktorgen();
	private int bir;
	private int iki;
	public void setBir(int bir) {
		this.bir = bir;
	}
	public void setIki(int iki) {
		this.iki = iki;
	}

	public int getBir() {
		return bir;
	}
	public int getIki() {
		return iki;
	}
//calculatedField() metodunu alanHesapla() isimiyle
//çağırmak için adapter yanı bağdaştırıcı yazdık.
	public int alanHesapla(int a, int b) {
		setBir(a);
		setIki(b);
		return nesnem.calculatedField(a, b);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/XPsnWvBh

package www.ethemsulan.com;
public class TestAdapter {
	public static void main(String[] args) {
AlanHesaplaArayuzumuz obje=new Kare();
System.out.println("Kare alani: "+obje.alanHesapla(10, 10));
obje=new DikUcgen();
System.out.println("Dik ucgen alani: "+obje.alanHesapla(3, 4));
obje=new AdapterDikdortgen();
System.out.println("Dikdotrgen alani: "+obje.alanHesapla(20, 30));;
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/ghgs6V1E

uml

Dia: http://prntscr.com/54k9 Clone() object sınıfnda yer aldığı için tüm nesnelerin klonları alınabilir.Yanı java nesnelerin hiyerarşinin en üstündeki objet sınıfında yer alır.hashCode() nesnelerin nerde olduğunu yada nesneyi tanımlayan bir belirteçtir.Bizim tc no gibi.Bellekteki adresin hexadeciaml olarak hashCode() yanı kimlik no olarak atanır.Klonlama ilede nesne oluşturulur ve mevcut nesne taban alınarak referans boyutu kadar ilk nesneye eklenerek ikinci bir nesne oluşturulur.New kullanmadan ikinci nesne oluşturuluyor.

package www.ethemsulan.com;
public class TestSinifi {
public static void main(String[] args) throws CloneNotSupportedException {
Kisi nesnem=new Kisi("Buyuklerimiz", 
	"Dedelerimiz", "Babamiz", "SULAN");
	nesnem.setBizimIsmimiz("Ethem");
	nesnem.ortakBilgileriYaz();
System.out.println("Birinci nesne tcNo:"+nesnem.hashCode());
//yukardaki nesneyi kopyalıyor.Belelktede ikl nesne boyutu + referans boyutu kadar
//başka bir adresten başlayarak nesne için yer ayrılır.Ve bu yeni
//klonlanan nesne bilgileri burada tutulur.Bu örnekte tüm bilgiler ortak sadece 
//kardeşleri sıraladık.Yani bir babanın çocuklarının hiyerarşileri aynı
//Bu şablon sınıf adedini azaltır.Karmaşık ve uzun işlem gereken 
//nesnelerde klonlama yolu seçilir.Başka bir avantajı ise 
//istediğimiz özelliği değiştirebiliriz.Yanı bir çok ortak 
//özellikten sadece birini değiştirmeye gerek duyulan durumlarda
//nesneyi klonlayıp o özelliği değiştirmek daha karlı olur.
	Kisi nesnem2=(Kisi)nesnem.birebirKopyala();
	nesnem2.setBizimIsmimiz("Mehmet Ethem");
	nesnem2.ortakBilgileriYaz();
	System.out.println("Ikinci nesne tcNo:"+nesnem2.hashCode());
	}  }

Orj kod:http://www.ethemsulan.pastebin.com/7dbSedSi

package www.ethemsulan.com;
public class Kisi extends OrtakKisiBilgileri {
public Kisi(String buyukDede, String dede, String baba,
		String bizimSoyIsmimiz) {
super(buyukDede, dede, baba, bizimSoyIsmimiz);
	}
private String birinciKisiIsmi;
public String getBirinciKisiIsmi() {
	return super.getBizimIsmimiz();
	}
public void setBirinciKisiIsmi(String birinciKisiIsmi) {
		super.setBizimIsmimiz(bizimIsmimiz);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/Dzt5vZ0c

package www.ethemsulan.com;
public class OrtakKisiBilgileri extends SoyAgaci {
public OrtakKisiBilgileri(String buyukDede,
String dede, String baba,String bizimSoyIsmimiz) {
		super();
		setBuyukDede(buyukDede);
		setDede(dede);
		setBaba(baba);
setBizimSoyIsmimiz(bizimSoyIsmimiz);
	}
}

Orj kod:http://www.ethemsulan.pastebin.com/Tt1z59L2

package www.ethemsulan.com;
public abstract class SoyAgaci implements Cloneable{
	private String buyukDede;
	private String dede;
	private String baba;
	private String bizimSoyIsmimiz;
	protected String bizimIsmimiz;
	public String getBizimIsmimiz() {
		return bizimIsmimiz;
	}
public void setBizimIsmimiz(String bizimIsmimiz) {
		this.bizimIsmimiz = bizimIsmimiz;
	}
public String getBizimSoyIsmimiz() {
		return bizimSoyIsmimiz;
	}
public void setBizimSoyIsmimiz(String bizimSoyIsmimiz) {
		this.bizimSoyIsmimiz = bizimSoyIsmimiz;
	}
	//Java'da en üstte obje bulunur.Her şey objeden türer.
//super üst sınıftaki metodu çağırır.
public Object birebirKopyala()throws CloneNotSupportedException{
		return (Object)super.clone();	
	}
	public String getBuyukDede() {
		return buyukDede;
	}
	public void setBuyukDede(String buyukDede) {
		this.buyukDede = buyukDede;
	}
	public String getDede() {
		return dede;
	}
	public void setDede(String dede) {
		this.dede = dede;
	}
	public String getBaba() {
		return baba;
	}
	public void setBaba(String baba) {
		this.baba = baba;
	}
	
	public void ortakBilgileriYaz(){
		System.out.println("Buyuk dede:"+getBuyukDede());
		System.out.println("Dede:"+getDede());
		System.out.println("Baba:"+getBaba());
		System.out.println("Sizin isminiz: "+getBizimIsmimiz());
		System.out.println("Aile soyadı:"+getBizimSoyIsmimiz());
	}   }

Orj kod:http://www.ethemsulan.pastebin.com/YxhYZ4wV

package www.ethemsulan.com;
public class SingletonSinifi {
//Bu siniftan sadece bu nesne tanimlanabilir
private static SingletonSinifi nesnem=null;
	private String degisken;
//Nesneye ayni adda erişimi engellemek için kilitleniyor
private static Object kilit=new Object();
//Yapici private yapilarak sadece bir nesne 
//turetilmesini saglayabiliriz.Yanı bir sınıftan bir nesne dışında nesne 
//tanımlamasını kısıtlamak için yapıcı private yapılır.
//Private yapılınca başka sınıftan new ile nesne türetemeyiz.
private SingletonSinifi(String degisken1){
		this.degisken=degisken1;
	}
//Bu sinifa ait nesneye bu metodla erisilir.Static olmak zorunda
//Bu tür işlemlerde static kavramı tam anlaşılmış olur
//Tek nesnemiz var ve başka yerden nesne türetemiyoruz.
//Buna erişmenin yolu static metodlardır.Çünkü nesne 
//üzerinden static lere erişilmiyor
public static SingletonSinifi degiskeniCagir(){
		//Nesne kullanılmıyor ve kiltledik.Başka threadin erişilmesini engelledik
if(nesnem==null){
//Eğer synchronized() olmasa sistemde birden fazla thread varsa
//Bu sınıftan birden fazla nesne türetilebilir.İçteki if ise 
//Köntrolu eline alan threadın daha önce
//nesneyi türetip türetmediğinin kontrolunu yapar.
//Java çoklu thread olduğundan sistemde birden fazla thread olabilir.			
	synchronized (kilit) {
		if(nesnem==null){
nesnem=new SingletonSinifi("Ethem");
				}
			}
		}
return nesnem;
	}
//Java multi thread ve single process tir.Çünkü jvm zaten bir process tir.
//Bir sistemde birden fazla süreç olamayıacağındak çoklu
 iş parçacığı 
//tekniği uygulanmış.Merak edilebilir neden java multi process değildir.
//Bu degiskeni çağıran metodumuzu yazalım
public void degeriYaz(){
		System.out.println(degisken);
	}
}
//Bu şekilde de olur ama tam kontrol sağlanılmıyor.
//Yukardaki şekilde kessinlikle ikinci bir nesne
//türetilemez.Ama bu şekilde üretilme imkanı var azda olsa.
//public static SingletonSinifi degiskeniCagir(){
//if(nenem==null){
//nesne=SingletonSinifi("Ethem");
//  }
//return nesnem;
//}

orj kod:http://www.ethemsulan.pastebin.com/8xhH3gvi

package www.ethemsulan.com;
public class TestSinifi {
public static void main(String[] args) {
//Sinifismi.StaticMetod(Nesne oluşturan metodumuz).normalMetodumuz
SingletonSinifi.degiskeniCagir().degeriYaz();
//Başka şekilde normal metodumuza erişemiyoruz.Tek nesnemiz var
//bu nesneyide degiskeniCagir() metodu oluşturuyor ve geriye o
//oluşturduğu nesneyi dönderir.
//yapıcı private olduğundan burada new ile nesne türetemeyiz.
		}
}

orj kod:http://www.ethemsulan.pastebin.com/mR63jRve

Bir sitemde bir sınıftan sadece bir nesne oluşturarak uygulama bopyunca kullanılmasını sağlamak için kullanılır.Yanı sınıftan ikinci bir nesne türetilememesi gereken durumlarda kullanılır.Bu nesneyi çağıran metodta static olmak zorunda.

UML diagramı:http://prntscr.com/4uig 
package www.ethemsulan.com;
public class TestSinifi {
//Bu fabrika oluşturmamızı sağlar.Ilişkili nesne türleri 
//oluşturmad akullanılır.Yanı fabrika üreten fabrikadır.
public static void main(String[] args) {
//Hayvalari omurgali ve omurgasiz olaraka yirdik.
//Soyut fabrikadan yeni fabrikalar üreterek tüm
//diğer hayvan türlerini yazabiliriz.Fabrika1
SoyutFabrika nesne=new Fabrika1();
Omurgali omli=nesne.getOmurgali();
System.out.println(omli.getTur());
Omurgasiz omsiz=nesne.getOmurgasiz();
System.out.println(omsiz.getTur());
//Fabrika2 
nesne=new Fabrika2();
omli=nesne.getOmurgali();
System.out.println(omli.getTur());
omsiz=nesne.getOmurgasiz();
System.out.println(omsiz.getTur());
    }  }
//------------------------------------------------
package www.ethemsulan.com;
//Ilişkili bir çok nesne grubu oluşturmak için kullanılır
//Bu kalıp geriye bir fabrika dönderir
public interface SoyutFabrika {
    public Omurgali getOmurgali();
    public Omurgasiz getOmurgasiz();
}
//------------------------------------------------
package www.ethemsulan.com;
public class Fabrika1 implements SoyutFabrika{
public Omurgali getOmurgali() {
        return new Memeliler();
    }
public Omurgasiz getOmurgasiz() {
        return new Solucanlar();
    }  }
//------------------------------------------------
package www.ethemsulan.com;
public class Fabrika2 implements SoyutFabrika{
public Omurgali getOmurgali() {
        return new Balıklar();
    }
public Omurgasiz getOmurgasiz() {
        return new Eklembacaklılar();
    } }
//------------------------------------------------
package www.ethemsulan.com;
public interface Omurgali {
    public String getTur();
}
//------------------------------------------------
package www.ethemsulan.com;
public interface Omurgasiz {
    public String getTur();
}
//------------------------------------------------
package www.ethemsulan.com;
public class Memeliler implements Omurgali {
public String getTur() {
        return "Memelilerden Keseli memeliler";
    } }
//------------------------------------------------
package www.ethemsulan.com;
public class Solucanlar implements Omurgasiz {
public String getTur() {
        return "Solucanlardan Yassı solucanlar";
    } }
//------------------------------------------------
package www.ethemsulan.com;
public class Balıklar implements Omurgali {
public String getTur() {
        return "Balıklardan Kemikli balıklar";
    } }
//------------------------------------------------
package www.ethemsulan.com;
public class Eklembacaklılar implements Omurgasiz {
public String getTur() {
        return "Eklem bacaklılardan Böcekler";
    } }

Orj kod:http://www.ethemsulan.pastebin.com/EedbcD6E

http://www.ethemsulan.pastebin.com/FHevmTyK

http://www.ethemsulan.pastebin.com/x6z3qafG

http://www.ethemsulan.pastebin.com/XnB9wgJh

http://www.ethemsulan.pastebin.com/Vmbv7Na6

http://www.ethemsulan.pastebin.com/P3Vp2wMt

http://www.ethemsulan.pastebin.com/sf0QbaNY