Fabrika ve strateji kalıpları arasındaki farkı kimse açıklayabilir mi?
Benim için her ikisi de fazladan bir fabrika sınıfı dışında aynı görünüyor (fabrika modellerinde bir ürün nesnesi yaratan)
Fabrika ve strateji kalıpları arasındaki farkı kimse açıklayabilir mi?
Benim için her ikisi de fazladan bir fabrika sınıfı dışında aynı görünüyor (fabrika modellerinde bir ürün nesnesi yaratan)
Yanıtlar:
Fabrika kalıbı, yaratımsal bir kalıptır. Strateji modeli, operasyonel bir modeldir. Başka bir deyişle, belirli bir türden nesneler oluşturmak için bir fabrika kalıbı kullanılır. Bir strateji modeli, belirli bir şekilde bir işlemi (veya bir dizi işlemi) gerçekleştirmek için kullanılır. Klasik örnekte, bir fabrika farklı Hayvan türleri yaratabilir: Köpek, Kedi, Kaplan, bir strateji modeli belirli eylemleri gerçekleştirebilir, örneğin, Taşı; Run, Walk veya Lope stratejilerini kullanarak.
Aslında ikisi birlikte kullanılabilir. Örneğin, iş nesnelerinizi yaratan bir fabrikanız olabilir. Kalıcılık ortamına göre farklı stratejiler kullanabilir. Verileriniz yerel olarak XML'de depolanıyorsa, tek bir strateji kullanır. Veriler farklı bir veritabanında uzak olsaydı, başka birini kullanırdı.
Strateji kalıbı, bir sınıfın davranışını polimorfik olarak değiştirmenize izin verir.
Fabrika kalıbı, nesne oluşturmayı kapsüllemenize izin verir.
Gary harika bir noktaya değiniyor. Eğer "somutlaştırmalar" yerine soyutlamalara kodlama ilkesini kullanıyorsanız, o zaman birçok desen bir temanın varyasyonları gibi görünmeye başlar.
Sadece tvanfosson'un söylediğine ek olarak, birçok kalıp uygulama açısından aynı görünüyor. Yani, kodunuzda belki de daha önce bulunmayan bir arayüz yarattınız ve ardından bu arayüzün bir dizi uygulamasını yarattınız. Fark, amaçlarında ve nasıl kullanıldıklarında.
Yalnızca somut örnekler oluşturun. Farklı argümanlar farklı nesnelerle sonuçlanabilir. Mantığa vb. Bağlıdır.
Bir eylemi gerçekleştirmek için algoritmayı (adımları) kapsülleyin. Böylece stratejiyi değiştirebilir ve başka bir algoritma kullanabilirsiniz.
Her ikisi de çok benzer görünse de amaç oldukça farklıdır, amaçlardan biri diğerini yaratmaktır, bir eylemi gerçekleştirmektir.
Yani. Fabrika yönteminiz sabitse, şöyle olabilir:
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
Ancak fabrikanızın daha gelişmiş veya dinamik bir yaratıma ihtiyacı olduğunu varsayalım. Fabrika yöntemine bir strateji ekleyebilir ve yeniden derlemek zorunda kalmadan onu değiştirebilirsiniz, strateji çalışma zamanında değişebilir.
Öncelikle basit fabrika ile soyut fabrika arasında bir fark yapılmalıdır. İlki, nesne oluşturma için fabrika olarak hareket eden yalnızca bir sınıfa sahip olduğunuz basit bir fabrikadır, ikincisinde ise bir fabrika arayüzüne (yöntem adlarını tanımlayan) bağlanırsınız ve ardından bu arayüzü uygulayan farklı fabrikaları çağırırsınız. bazı kriterlere göre aynı yöntemin farklı uygulamalarına sahip olmaları beklenir. Örneğin, ilk WindowsButtonCreationFactory (Windows görünümü ve hissi ile düğmeler oluşturur) ve ikinci LinuxButtonCreationFactory (Linux görünümü ve hissi ile düğmeler oluşturur) olmak üzere iki fabrika tarafından uygulanan bir ButtonCreationFactory arayüzüne sahibiz. Yani her iki fabrika da farklı uygulamalarla (algoritmalarla) aynı oluşturma yöntemine sahip.
Örneğin, Linux görünümüne ve hissine sahip düğmeler istiyorsanız:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
veya Windows düğmelerini istiyorsanız
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
Tam olarak bu durumda, bazı oluşturma yapmak için algoritmaları farklılaştırdığı için bir tür strateji modeliyle sonuçlanır. Ancak, operasyonel algoritmalardan ziyade NESNE OLUŞTURMA için kullanıldığından anlamsal olarak ondan farklılık gösterir. Yani, temelde soyut fabrika ile farklı stratejiler kullanarak nesne yaratma olanağına sahipsiniz, bu da onu strateji modeline çok benziyor. Bununla birlikte, Soyut Fabrika yaratıcıdır, ancak Strateji modeli çalışır durumdadır. Uygulama bilge, aynı şekilde sonuçlanır.
Fabrika (ve Fabrika tarafından iade edilen FactoryMethod) :
Bu wikipedia makalesine ve javarevisited makaleye bir göz atın
Strateji kalıbı:
Misal:
Belirli bir öğe için İndirim stratejisini yapılandırabilirsiniz (Uçak Bileti veya ShoppingCart öğesi). Bu örnekte, Temmuz - Aralık aylarında bir ürüne% 25 indirim sunacak ve Jaunary - Haziran döneminde ürün için indirim yapmayacaksınız.
İlgili Mesajlar:
Strateji Modelinin Gerçek Dünyadan Örneği
Tasarım Modelleri: Fabrika - Fabrika yöntemi - Soyut Fabrika
Basit terimlerle strateji modeli, uygulama sınıfı ile ilgilenmediğiniz çalışma zamanında davranış yaratımıdır. Öte yandan fabrika, somut sınıf örneğinin çalışma zamanında oluşturulmasıdır ve uygulanan arabirim tarafından ortaya çıkan herhangi bir davranışı (yöntemi) kullanmak size kalmıştır.
Oscar'ın söylediklerini ve koduna referansla devam etmek için:
GetCommand Fabrika'dır ve UnixCommand, WindowsCommand ve OSXCommand sınıfları Stratejilerdir
Sadece koda veya kategorilere bakarak farkı anlayamazsınız. GoF modellerini doğru bir şekilde kavramak için amaçlarına bakın:
Strateji: "Bir algoritma ailesi tanımlayın, her birini kapsülleyin ve birbirinin yerine kullanılabilir hale getirin. Strateji, algoritmanın onu kullanan istemcilerden bağımsız olarak değişmesine izin verir."
Fabrika Yöntemi: "Bir nesne oluşturmak için bir arabirim tanımlayın, ancak hangi sınıfın başlatılacağına alt sınıfların karar vermesine izin verin. Fabrika Yöntemi, bir sınıfın alt sınıflara örneklemesini ertelemesine izin verir."
Ve burada niyetler ve bu iki model arasındaki farklar hakkında ayrıntılı bir açıklama var: Fabrika Yöntemi ile Strateji tasarım kalıpları arasındaki fark
Oscar'ın bir Fabrika uygulaması örneğinin oldukça sıkı bir şekilde bağlantılı ve çok kapalı olduğu konusunda konuşabilirim, seçiminizin Strateji modeli olmasına şaşmamalı. Bir Fabrika uygulaması, somutlaştırılan sabit sayıda belirli sınıfa bağlı olmamalıdır, Örneğin:
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
Sanırım birini veya diğerini seçmek için en uygun kriter, çoğunlukla sınıflarınızı ve yöntemlerinizi adlandırmak için kullandığınız terimlerdir, göz önünde bulundurarak hepimizin sınıflara değil arayüzlere programlamaya eğilimliyiz ve aynı zamanda hedefe odaklanmalıyız: belirlemeyi hedefliyoruz çalışma zamanında hangi kodun çalıştırılacağı. Bununla birlikte, her iki modelden herhangi birini kullanarak hedefe ulaşabiliriz.
Strateji ve Fabrika farklı amaçlardır. Stratejide, tanımlanmış yaklaşıma sahipsiniz, bu modeli kullanarak davranışı (algoritmalar) değiştirebilirsiniz. Fabrikaya gelmekle ilgili pek çok varyasyon var. Ancak GO4'ten orijinal model, fabrikanın nesnenin yaratılmasını çocuk sınıfına bıraktığını belirtir. Burada fabrika ile ilgilendiğiniz davranışı değil tam örneği değiştiriyorsunuz. Bununla, algoritmayı değil tüm sistemi değiştirmiş olacaksınız.
Fabrika kalıbı, belirtilen özelliklerle (davranış) oluşturulan yaratıcı bir kalıptır. oluşturulduktan sonraki çalışma zamanında, özelliklerini (davranışını) değiştiremezsiniz. bu nedenle farklı özelliklere (davranışa) ihtiyacınız varsa, nesneyi silmeli ve gerekli özelliklere (davranış) sahip yeni nesne yaratmalısınız. ki gud değil. strateji modeli durumunda, u çalışma zamanında özellikleri (davranışı) değiştirebilir.