3.1 Tekil

Singleton , tek iş parçacıklı bir uygulamanın bir sınıfın tek bir örneğine sahip olacağını garanti eden ve bu örneğe küresel bir erişim noktası sağlayan genel bir tasarım modelidir.

Tekil

Çoğu zaman, acemi programcılar yardımcı yöntemleri bazı statik sınıflarda - yalnızca statik yöntemler içeren bir sınıf - bir araya getirmeyi severler. Bu yaklaşımın bir takım dezavantajları vardır - örneğin, böyle bir sınıfın nesnesine bir referans iletemezsiniz, bu tür yöntemlerin test edilmesi zordur ve benzerleri.

Alternatif olarak, tek bir sınıf çözümü önerildi: yalnızca bir nesneye sahip olabilen bir sınıf. Bu nesneyi oluşturmaya çalışırken, yalnızca zaten mevcut değilse oluşturulur, aksi takdirde zaten var olan bir örneğe bir referans döndürülür.

Çoğu durumda daha geniş işlevsellik kullanılabilir hale geldiğinden, sınıfın bir örneğini kullanmanın mümkün olması önemlidir. Örneğin, bu sınıf bazı arabirimleri uygulayabilir ve nesnesi, arabirimin bir uygulaması olarak diğer yöntemlere geçirilebilir. Bir dizi statik yöntemle ne yapılamaz.

Artıları:

  • Yöntemler, statik bir sınıfa değil, bir nesneye bağlıdır - bir nesneyi referans olarak iletebilirsiniz.
  • Nesne yöntemlerinin test edilmesi ve taklit edilmesi çok daha kolaydır.
  • Bir nesne yalnızca ihtiyaç duyulduğunda oluşturulur: yavaş nesne başlatma.
  • Başlatma için gerekli olmayan çok sayıda bekar varsa, programın ilk lansmanını hızlandırmak.
  • Tek başına bir şablon stratejisine veya bu tür birkaç nesneye dönüştürülebilir.

Eksiler:

  • İş parçacıkları arasındaki yarışları ve gecikmeleri kontrol etmek daha zor hale gelir.
  • Çok iş parçacıklı bir "yalnız" "kafadan" yazmak zordur: uzun süredir devam eden bir singleton'a erişim, ideal olarak bir muteks açmamalıdır. Daha iyi kanıtlanmış çözümler.
  • Bitmemiş tek bir iş parçacığı üzerinden iki iş parçacığı arasındaki bir çakışma gecikmeye neden olur.
  • Nesne uzun süredir oluşturuluyorsa, gecikme kullanıcıyı etkileyebilir veya gerçek zamanı bozabilir. Bu durumda, oluşturulmasını program başlatma aşamasına aktarmak daha iyidir.
  • Birim testi için özel özellikler gereklidir - örneğin, kitaplığı "yalnız olmayan" moda geçirmek ve testleri birbirinden tamamen izole etmek.
  • Bitmiş programı test etmek için özel bir taktik gereklidir, çünkü "en basit başlatılabilirlik" kavramı bile ortadan kalkar, çünkü başlatılabilirlik yapılandırmaya bağlıdır.

3.2 Fabrika [Yöntem]

Fabrika yöntemi, alt sınıflara (sınıflar-mirasçılar) belirli bir sınıfın örneklerini oluşturmak için bir arabirim sağlayan genel bir tasarım modelidir. Oluşturma sırasında, torunlar hangi sınıfın oluşturulacağını belirleyebilir.

Başka bir deyişle, bu şablon, nesnelerin oluşturulmasını üst sınıfın soyundan gelenlere devreder. Bu, program kodunda somut sınıfları kullanmanıza değil, soyut nesneleri daha yüksek bir düzeyde işlemenize olanak tanır.

Fabrika Yöntemi

Bu model, bir nesne oluşturmak için bir arabirim tanımlar, ancak nesnenin hangi sınıfa dayanacağına karar vermeyi alt sınıflara bırakır. Bir fabrika yöntemi, bir sınıfın alt sınıfların oluşturulmasını devretmesine izin verir. Ne zaman kullanılır:

  • sınıf, hangi alt sınıflardan hangi nesneleri yaratması gerektiğini önceden bilmez.
  • bir sınıf, oluşturduğu nesneler alt sınıflar tarafından belirtilecek şekilde tasarlanır.
  • sınıf, sorumluluklarını birkaç yardımcı alt sınıftan birine devreder ve bu sorumlulukları hangi sınıfın üstleneceğinin belirlenmesi planlanır.

3.3 Soyut Fabrika

Soyut bir fabrika, somut sınıflarını belirtmeden ilgili veya birbirine bağımlı nesnelerin ailelerini oluşturmak için bir arayüz sağlayan genel bir tasarım modelidir.

Kalıp, sistem bileşenlerini oluşturmak için bir arayüz olan soyut bir Fabrika sınıfı yaratılarak uygulanır (örneğin, bir pencere arayüzü için, pencereler ve düğmeler oluşturabilir). Daha sonra bu arayüzü uygulayan sınıflar yazılır.

soyut fabrika

Programın süreçten ve oluşturulan yeni nesnelerin türlerinden bağımsız olması gereken durumlarda kullanılır. Aynı bağlamda bunların farklı kümelerinden nesnelerin eşzamanlı kullanım olasılığı hariç, ilgili nesne aileleri veya grupları oluşturmak gerektiğinde.

Güçlü:

  • belirli sınıfları izole eder;
  • ürün ailelerinin değiştirilmesini basitleştirir;
  • ürün uyumluluğunu garanti eder.

Diyelim ki programınız dosya sistemiyle çalışıyor. Daha sonra Linux'ta çalışmak için LinuxFile, LinuxDirectory, LinuxFileSystem nesnelerine ihtiyacınız var. Ve Windwos'ta çalışmak için WindowsFile, WindowsDirectory, WindowsFileSystem sınıflarına ihtiyacınız var.

Path.of() aracılığıyla oluşturulan Path sınıfı tam da böyle bir durumdur. Path gerçekten bir sınıf değil, bir arayüzdür ve WindowsPath ve LinuxPath uygulamalarına sahiptir. Ve ne tür bir nesne yaratılacağı kodunuzdan gizlenir ve çalışma zamanında karar verilir.

3.4 Prototip

Prototip, üretken bir tasarım modelidir.

Bu kalıp, bir prototip örneği kullanılarak oluşturulan nesne türlerini tanımlar ve bu prototipi kopyalayarak yeni nesneler oluşturur. Uygulamadan uzaklaşmanızı ve “arayüzler aracılığıyla programlama” ilkesini takip etmenizi sağlar.

Hiyerarşinin tepesindeki bir arabirim/soyut sınıf, geri dönen tür olarak belirtilir ve alt sınıflar, bu türü orada uygulayan bir mirasçının yerini alabilir. Basitçe söylemek gerekirse, bu, bir nesneyi bir yapıcı aracılığıyla oluşturmak yerine başka bir nesneyi klonlayarak oluşturma modelidir.

Prototip

Desen aşağıdakiler için kullanılır:

  • standart bir şekilde bir nesne yaratmanın ek çabasından kaçınmak (bir kurucu kullanmak anlamına gelir, çünkü bu durumda tüm nesnenin ata hiyerarşisinin kurucuları da çağrılacaktır), bu uygulama için çok pahalı olduğunda.
  • soyut fabrika modelinin yaptığı gibi, istemci uygulamasında nesne oluşturucuyu devralmaktan kaçının.

Programınız ürünleri nasıl oluşturduğunu, oluşturduğunu ve sunduğunu umursamadığında bu tasarım modelini kullanın:

  • örneklenen sınıflar, örneğin dinamik yükleme kullanılarak çalışma zamanında belirlenir;
  • ürün sınıfı hiyerarşisine paralel sınıf veya fabrika hiyerarşileri oluşturmaktan kaçınmak istiyorsunuz;
  • sınıf örnekleri birkaç farklı durumdan birinde olabilir. Sınıfı her seferinde uygun durumda manuel olarak başlatmaktansa, uygun sayıda prototip ayarlamak ve bunları klonlamak daha uygun olabilir.