1.YARATICI TASARIM DESENLERİ ÖRNEKLERİ
1.1.Tek Nesne ( Singleton ) Tasarım Deseni
Bu tasarım deseninde, bir sınıfın sistem içinde yalnızca bir tane nesnesi oluşturulabilir. Tek bir arayüz sunularak, bu nesneye yalnızca buradan erişim sağlanabilir. Bu desen kullanılarak, sistem içinde değeri değişmeyen, genel değişkenler bu oluşturulan tek nesneye konulabilir. Sistemde tek nesne yaratılabilme, statik değişken ve yordamlar sayesinde olur. Statik değişken ve yordamlar, nesneye dayalı programlanın esnekliğini, dinamik nesne yaratılma özelliklerini engellediği için bazı yazılım mühendisleri tarafından eleştirilebilir.
Örnek verelim;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Singleton { private static Singleton instance; private Singleton() { ... } public static synchronized Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } ... public void doSomething() { ... } } |
1.2.Fabrika Yordam ( Factory Method ) Tasarım Deseni
Fabrika yordam tasarım deseni, nesne yaratma sorumluluğunun bir yordama verilmesidir. Yaratılan nesne, bir sınıf hiyerarşisindeki alt sınıflardan biridir. Hangi alt sınıfın yaratılacağı kararı fabrika yordam içinde verilir. Bu yordam ile belirli bir sınıf hiyerarşisindeki alt nesnelerden birinin yaratma sorumluluğu belirli bir arayüze verilerek sistemden soyutlanmış olur. Böylece nesneleri yaratma kodlarında, kod tekrarları önlenmiş olur. Sistem içinde sınıfların yaratılacağı yer tek olduğu için, ilgili mantıklar tek bir yerde toplanabilir.
Örnek verelim;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.rayyildiz.patterns; public interface IDbConnection { String getConnection(); } public class OracleDbConnection implements IDbConnection { @Override public String getConnection() { return "Oracle Data Connection"; } } public class MySqlDbConnection implements IDbConnection { @Override public String getConnection() { return "MySql Data Connection"; } } public class MssqlDbConnection implements IDbConnection { @Override public String getConnection() { return "Mssql Data Connection"; } } |
Şimdi ise fabrika yönetimini yapan metodu görelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.rayyildiz.patterns; public enum DbConnectionType { Oracle, Mysql, Mssql } package com.sa.patterns; public class DbConnectionFactory { public static IDbConnection createDbConnection(DbConnectionType dbConnType){ switch(dbConnType){ case Oracle: return new OracleDbConnection(); case Mysql: return new MySqlDbConnection(); case Mssql: return new MssqlDbConnection(); } return null; } } |
1.3.Soyut Fabrika ( Abstract Factory ) Tasarım Deseni
Yaratılma sorumluluklarının çeşitli sınıf hiyerarşileri ile sağlandığı bir tasarım desenidir. İstemci sınıf, çeşitli kategorideki sınıflara ihtiyaç duyar. Bu sınıflar, sistemde alt/üst sınıf hiyerarşileri şeklinde bulunurlar. “Soyut Fabrika” tasarım deseni bu karmaşık ve farklı hiyerarşideki sınıfların yaratılma sorumluluğunu çeşitli fabrika sınıflarına verir. İstemci ilk önce verdiği kriterlere göre uygun bir fabrika sınıfını seçer. Ardından seçtiği fabrika nesnesi, istemcinin ihtiyaç duyduğu sınıfları yaratıp istemciye döner. İstemci sınıf, kullandığı sınıfların sadece üst sınıflarını, yani soyut sınıflarını bilir. Bu sınıfları ona yaratıp döndüren fabrika sınıfının da sadece soyut sınıfını içerir. Alttaki detaylar istemci sınıftan gizlenmiş, sorumluluk “Soyut Fabrika” tasarım deseni ile fabrika sınıflarına verilmiştir. Bu tasarım deseni Fabrika Yordam tasarım desenine benzer. Fakat bu tasarım deseninde yaratılacak birden fazla sınıf hiyerarşisi tipi bulunur. Fakat “fabrika yordam” tasarım deseninde tek tip nesne yaratılması ihtiyacı bulunur.
Kısaca bu tasarım deseni ile birden fazla sınıf hiyerarşisi nesneleri, kurulacak birden fazla fabrika nesneleri ile yaratılır. İstemci kendisine uygun fabrika nesnesini yarattırır. İhtiyacı olan nesnelerin yaratılma sorumluluğunu fabrika nesnelerine bırakır.
1.Adım: Shape interface’i oluşturalım.
1 2 3 |
public interface Shape { void draw(); } |
2.Adım:
1 2 3 4 5 6 7 |
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } |
1 2 3 4 5 6 7 |
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } } |
3.Adım: Color interface’ini oluşturalım.
1 2 3 |
public interface Color { void fill(); } |
4.Adım: Red, green, blue isimli class’lar oluşturalım
1 2 3 4 5 6 7 |
public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } } |
1 2 3 4 5 6 7 |
public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); } } |
1 2 3 4 5 6 7 |
public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); } } |
5.Adım:
1 2 3 4 |
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ; } |
6.Adım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); }else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } @Override Color getColor(String color) { return null; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Color getColor(String color) { if(color == null){ return null; } if(color.equalsIgnoreCase("RED")){ return new Red(); }else if(color.equalsIgnoreCase("GREEN")){ return new Green(); }else if(color.equalsIgnoreCase("BLUE")){ return new Blue(); } return null; } } |
1.4.Kopya Nesne ( Prototype ) Tasarım Deseni
Var olan bir nesneden, kopyalama yöntemi ile yeni nesne yaratmak için bu tasarım deseni kullanılır. Nesne yaratmak için “new” operatörü kullanılmaz. Yazılım dillerindeki “clone” gibi, nesne kopyalama yordamlarından faydalanılır. Örneğin java programlama dilinde, bir nesnenin kopyalanabilmesi için, nesnenin “Cloneable” arayüzünden türemiş olması gereklidir.
Bazı nesneler çok büyük olup, çok kaynak harcıyor olabilir. Bu nesnelerin yeniden yaratılması yerine, kolonlanması performans ve kaynak kullanımı açısından tasarruf edilmesine yarar. Bu durumlarda “Kopya Nesne” tasarım deseni kullanılabilir.
1.5.Kurucu ( Builder ) Tasarım Deseni
Bu tasarım deseni ile bir nesneyi, bir sınıfı, aşama aşama farklı özellikleri ile oluşturabiliriz. Nesneyi farklı özellikler ile oluşturmaya yarayan bu sınıfa Kurucu nesne ismi verilir. Kurucu nesneden farklı özelliklerde alt sınıflar da türeyebilir. Kurucunun oluşturduğu nesneye ihtiyaç duyan istemci sınıf, istediği özelliklerde nesneyi oluşturabilecek kurucu oluşturur ve kurucuya istediği nesnenin oluşması için isteklerde bulunur. En sonunda da bu nesneyi alır ve kullanır. İstemci böylece nesne yaratma sorumluluğunu kurucu nesneye bırakmış olur. Tabi her basit nesnenin, bir de kurucusunu oluşturmaya gerek yoktur. Kurucu nesne genelde, içinde çok özellik barındıran, karmaşık nesnelerin oluşumunda görev alması daha yerindedir.
Yazının devamı için bkz.