Motivasyonlardaki farklılıkları anlayın:
Varsayalım ve nesnelerin birbirleriyle olan ilişkilerinin somut bir şekilde uygulandığı bir araç oluşturduğunuzu varsayalım. Nesnelerdeki varyasyonları öngördüğünüz için, başka bir nesneye nesnelerin varyantlarını oluşturma sorumluluğunu atayarak bir dolaylılık yarattınız ( buna soyut fabrika diyoruz ). Bu soyutlama, bu nesnelerin varyantlarına ihtiyaç duyan gelecekteki uzantıları öngördüğünüz için güçlü bir fayda sağlar.
Bu düşünce çizgisindeki oldukça ilginç bir motivasyon, tüm gruptaki nesnelerin her birinin veya hiçbirinin karşılık gelen bir varyanta sahip olacağı bir durumdur. Bazı koşullara bağlı olarak, değişkenlerden herhangi biri kullanılır ve her durumda tüm nesneler aynı varyantta olmalıdır. Bu, bir nesnenin varyantları ortak bir tek tip sözleşmeyi ( daha geniş anlamda arayüz) takip ettikleri sürece , somut uygulama kodunun asla kırılmaması gerektiğini düşündüğümüzden anlamak için biraz sezgisel olabilir . Buradaki ilginç gerçek şu ki, özellikle beklenen davranış bir programlama sözleşmesi ile modellenemediğinde bu her zaman doğru değildir.
Basit ( fikri GoF'den ödünç almak ) herhangi bir GUI uygulaması, MS veya Mac veya Fedora OS'lerin görünüşünü taklit eden bir sanal monitör söylüyor. Burada, örneğin, pencere, düğme vb. Tüm widget nesneleri MAC varyantından türetilen bir kaydırma çubuğu dışında MS varyantına sahip olduğunda, aracın amacı kötü bir şekilde başarısız olur.
Yukarıdaki durumlar, Soyut Fabrika Şablonunun temel ihtiyacını oluşturmaktadır .
Öte yandan, birçok kişinin çerçevenizi kullanarak çeşitli araçlar ( örneğin yukarıdaki örneklerde olduğu gibi ) oluşturabileceği bir çerçeve yazdığınızı düşünün . Bir çerçeve fikriyle, mantığınızda somut nesneler kullanamasanız da, buna gerek yoktur. Çeşitli nesneler ve bunların nasıl etkileştikleri arasında bazı üst düzey sözleşmeler yapmayı tercih edersiniz. Siz ( bir çerçeve geliştiricisi olarak ) çok soyut bir düzeyde kalırken, aracın her kurucuları çerçeve yapılarınızı takip etmek zorunda kalırlar. Bununla birlikte, onlar ( araç üreticileri ) hangi nesnenin inşa edileceğine ve oluşturdukları tüm nesnelerin nasıl etkileşime gireceğine karar verme özgürlüğüne sahiptir. Önceki durumdan farklı olarak ( Soyut Fabrika Deseni ), siz ( çerçeve yaratıcısı olarak)) bu durumda somut nesnelerle çalışmanıza gerek yoktur; daha ziyade nesnelerin sözleşme düzeyinde kalabilir. Dahası, önceki motivasyonların ikinci kısmından farklı olarak, siz veya araç üreticileri asla varyantlardan nesneleri karıştırma durumlarına sahip değildir. Burada, çerçeve kodu sözleşme düzeyinde kalırken, her araç üreticisi ( davanın doğası gereği ) kendi nesnelerini kullanmakla sınırlıdır . Bu durumda nesne oluşturma işlemleri her uygulayıcıya devredilir ve çerçeve sağlayıcıları yalnızca nesne oluşturma ve döndürme için tek tip yöntemler sağlar. Bu tür yöntemler, çerçeve geliştiricisinin kodlarıyla devam etmesi için kaçınılmazdır ve Fabrika yöntemi ( altta yatan model için Fabrika Yöntem Kalıbı) adı verilen özel bir ada sahiptir .
Birkaç Not:
- 'Şablon yöntemi' konusunda bilginiz varsa, herhangi bir çerçeve biçimiyle ilgili programlar olması durumunda fabrika yöntemlerinin genellikle şablon yöntemlerinden çağrıldığını görürsünüz. Buna karşılık, uygulama programlarının şablon yöntemleri genellikle belirli algoritmanın basit uygulanması ve fabrika yöntemlerinin boşluğudur.
- Ayrıca, düşüncelerin bütünlüğü için, ( yukarıda belirtilen ) çerçeveyi kullanarak, bir araç üreticisi bir araç inşa ederken, her fabrika yönteminin içinde, somut bir nesne oluşturmak yerine, sorumluluğu bir özete devredebilir -yapıcı nesne, araç üreticisi gelecekteki genişletmeler için beton nesnelerin varyasyonlarını öngörmesi koşuluyla.
Basit kod:
//Part of framework-code
BoardGame {
Board createBoard() //factory method. Default implementation can be provided as well
Piece createPiece() //factory method
startGame(){ //template method
Board borad = createBoard()
Piece piece = createPiece()
initState(board, piece)
}
}
//Part of Tool-builder code
Ludo inherits BoardGame {
Board createBoard(){ //overriding of factory method
//Option A: return new LudoBoard() //Lodu knows object creation
//Option B: return LudoFactory.createBoard() //Lodu asks AbstractFacory
}
….
}
//Part of Tool-builder code
Chess inherits BoardGame {
Board createBoard(){ //overriding of factory method
//return a Chess board
}
….
}