Fabrika ve Strateji kalıpları arasındaki fark nedir?


Yanıtlar:


234

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ı.


1
"Strateji modeli, belirli bir şekilde bir işlemi (veya bir dizi işlemi) gerçekleştirmek için kullanılır." Nesneler üzerindeki işlemler anlamına mı gelir?
OPV

33

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.


26

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.


13
  • Fabrika (yöntem) Modeli.

Yalnızca somut örnekler oluşturun. Farklı argümanlar farklı nesnelerle sonuçlanabilir. Mantığa vb. Bağlıdır.

  • Strateji Modeli.

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.


Burada doğru bir noktaya değindiğinizi sanmıyorum. Her şeyden önce, bu kalıpların nedenlerinden biri, polimorfizm lehine koşullardan kaçınmaktır. Öncelikle basit fabrika ile soyut fabrika arasında bir fark yapılmalıdır. D Birincisi, nesne oluşturma için bir fabrika görevi gören yalnızca bir sınıfa sahip olduğunuz, ikincisinde bir arayüze bağlanıp ardından arama yaptığınız basit bir fabrikadır. bazı kriterlere göre aynı yöntemin farklı uygulamalarına sahip olması beklenen bu arayüzü uygulayan farklı fabrikalar. (devam ediyor)
interboy

4
Tam olarak bu durumda, bir tür strateji modeliyle sonuçlanır, ancak anlamsal olarak ondan farklıdır çünkü işlemlerden ziyade NESNE OLUŞTURMA için kullanılır. Yani, temelde farklı stratejiler kullanarak nesne oluşturuyorsunuz.
interboy

2
@OscarRyz Can Eğer bir programın hem nitelendirdi cevap güncellemek lütfen
Prakash Pandey

11

Ö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.


11

Fabrika (ve Fabrika tarafından iade edilen FactoryMethod) :

  1. Yaratılış modeli
  2. Mirasa dayalı
  3. Factory, bir Fabrika Yöntemi (arayüz) döndürür ve bu da Somut Nesne döndürür
  4. Arayüz yerine yeni Beton Nesneler koyabilirsiniz ve müşteri (arayan) tüm somut uygulamalardan haberdar olmamalıdır.
  5. İstemci her zaman yalnızca arayüze erişir ve fabrika yönteminde nesne oluşturma ayrıntılarını gizleyebilirsiniz.

Bu wikipedia makalesine ve javarevisited makaleye bir göz atın

Strateji kalıbı:

  1. Bu davranışsal bir kalıp
  2. Yetkilendirmeye dayalıdır
  3. Yöntem davranışını değiştirerek nesnenin cesaretini değiştirir
  4. Algoritma ailesi arasında geçiş yapmak için kullanılır
  5. Çalışma zamanında nesnenin davranışını değiştirir

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


4

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.


3

Oscar'ın söylediklerini ve koduna referansla devam etmek için:

GetCommand Fabrika'dır ve UnixCommand, WindowsCommand ve OSXCommand sınıfları Stratejilerdir


2

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


1

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.


1

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.


1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.