Bir tasarım deseni, yazılım tasarımında yaygın olarak ortaya çıkan bir soruna genel olarak tekrarlanabilir bir çözümdür. Bir tasarım deseni, doğrudan koda dönüştürülebilen bitmiş bir tasarım değildir. Birçok farklı durumda kullanılabilecek bir problemin nasıl çözüleceğine dair bir açıklama veya şablondur.
Yaratıcı tasarım kalıpları, duruma uygun bir şekilde nesneler yaratmaya çalışan, nesne oluşturma mekanizmalarıyla ilgilenen tasarım kalıplarıdır. Temel nesne oluşturma biçimi, tasarım sorunlarına veya tasarıma ek karmaşıklıklara neden olabilir. Yaratıcı tasarım kalıpları, bu nesne oluşumunu bir şekilde kontrol ederek bu sorunu çözer.
Builder Tasarım Deseni, bir nesnenin oluşum aşamasında farklı nesnelere de ihtiyaç olduğu durumlarda kullanılır. Yani karmaşık yapıdaki bir nesne, değişik özelliklerin(nesnelerin) bir araya gelmesiyle oluşur. Birden fazla adım barındıran nesne üretim sürecinde, farklı parçalar birleştirilir ve istenilen tipteki nesne oluşturulmuş olur.
Factory Tasarım Deseni, bu tasarım deseni bir nesne yaratmak için arayüz sağlar ve hangi sınıftan nesne yaratılacağını alt sınıfların belirlemesine olanak tanır. Asıl amaç oluşturmak istediğimiz sınıfların tek tek instance oluşturmak yerine bu oluşturma işlemini tek bir sınıf üzerinden yönetmek.
Singleton Tasarım Deseni, bir sınıfın tek bir örneğini almak için kullanılır.Amaç oluşturulan nesneye global erişim noktası sağlamaktır.Sistem çalıştığı sürece ikinci bir örnek oluşturulmaz, böylelikle istenen nesnenin tek bir defa oluşturulması garanti altına alınacaktır.Singleton nesneler ilk çağırıldıklarında bir kere oluşturulurlar ve sonraki istekler bu nesne üzerinden karşılanır.
Yapısal Tasarım Modelleri, varlıklar arasındaki ilişkileri gerçekleştirmenin basit bir yolunu belirleyerek tasarımı kolaylaştıran Tasarım Modelleridir.
Adaptör Tasarım deseni, mevcut bir sınıfı veya arayüz sınıfını, eldeki farklı bir arayüz sınıfına uygun hale getirerek tekrar kullanmak amacıyla uygulanır. Çoğu zaman işe yarayacağını düşündüğümüz mevcut bir sınıfı kendi sistemimizde tekrar kullanmak isteriz. Fakat mevcut sınıf, tam beklediğimiz gibi olmayabilir. Bu durumda araya bir tane adaptör yazarak, mevcut sınıfı kendi sistemimize uygun hale getirebiliriz. Böylece adapte edilen nesnede kod değişikliği olmadan benzer bir arayüzü destekler hale getiririz. Ayrıca adaptasyon işlemi sırasında, adapte edilen nesnenin desteklemediği özellikler de adaptör tarafından gerçekleştirilebilir.
Bridge Tasarım Deseni, soyutladığımız nesneler ile işi gerçekleyecek somut nesneler arasında köprü kurar. Soyut sınıflar ve işi yapacak sınıfları birbirinden ayırdığı için iki sınıf tipinde yapılcak bir değişiklik birbirini etkilemez. Hangi sınıfın kullanılacağına çalışma zamanında karar verilir. Bu mekanizma sayesinde çalışma alanında, gerçek işi yapan sınıf değiştirilebilir.
Decorator Tasarım Deseni, soyutlayarak gevşek bağlılığı sağladığımız sistemimizde mevcut yapımız için yeni metotlar ekleneceği zamanlar kullanılır. Sistemin yapısını bozmadan dinamik metotlar ekleyebileceğimiz bir yapıdadır. Sistemi bu hale getirebilmek için yapının arayüzünden türeyen bir adet decorator sınıfı yazılır. Yazılan bu sınıfın içerisinde kendi türediği sınıfa bir bağımlılık yani referans barındırır. Anlaşılması başta karmaşık gelen bu desen, yeni eklenen yetenekler için kullanılır.
Davranışsal tasarım kalıpları, nesneler arasındaki ortak iletişim kalıplarını tanımlayan ve bu kalıpları gerçekleştiren tasarım kalıplarıdır. Bunu yaparak, bu modeller bu iletişimin gerçekleştirilmesindeki esnekliği artırır.
Chain of Responsibility Tasarım Deseni, kod karmaşasını önlemek amacıyla oluşturulmuştur. Bir işlemi yapabilecek birden fazla sınıftan hangisinin yapacağına karar veren tasarım desenidir. Projelerimizde birden fazla koşullu metotlar yazmak istediğimizde her koşul için if else blokları açılır ve ilgili metotlar çalıştırılmaktadır. Bu yapıyı if else blokları yerine chain of responsbility ( sorumluluk zinciri ) tasarım desenini kullanılır. Bu tasarım deseninde 3 ana yapı vardır. Handler : Kendisinden türeyecek ConcreteHandler’ ların, işleyebilmesi için gerekli olan arayüzdür. Abstract class yada Interface şeklinde tanımlanabilir. ConcreteHandler : Gelen isteğe cevap verebilecek gerekirse isteği kendisinden sonra gelen nesneye iletir. Client : Zinciri oluşturan ve zincirin ilk halkasına isteği gönderen nesnedir.
Mediator Tasarım Deseni, birçok bileşenin birbirinden servis kullandığı ve bu servis kullanımlarından dolayı bağımlılıkların çok arttığı durumlarda bu bağımlılıkları merkeze taşıyarak bağımlılık kaosunu çözen bir yaklaşımdır.
Observer Tasarım Deseni, nesneler arasında one-to-many ilişkisi olduğu durumlarda tercih edilen bir desendir. Yani bir nesnede olan herhangi bir değişiklik, bu nesneye bağımlı diğer nesneleri de etkiliyorsa bu desen kullanılır.