Fabrika ve Soyut Fabrika Tasarım Desenleri arasındaki temel fark nedir? [kapalı]


483

Fabrika ve Soyut Fabrika Kalıpları arasındaki temel fark nedir?


11
Bence Soyut Fabrika Deseni ve Fabrika Yöntemi Arasındaki Farklardaki cevapların kalitesi, buradakinden çok daha iyi.
KurzedMetal

1
Temel fark, Fabrika Metodunun kalıtım (dolaylı dikey örn. createThing()) Kullanması ve Abstract Factory kompozisyon (dolaylı yatay örn. getFactory().createThing())
David James

1
Bu soru bazı cevaplayıcılarının ne düşündüğü değil. Fabrika, Soyut Fabrika ve Fabrika Yöntemi olmak üzere üç ayrı terimi tanımlayan Tengiz'in cevabını kaçırmayın .
Dave Schweisguth

Yanıtlar:


412

Fabrika desen ile, uygulamaların örneklerini (üretmek Apple, Banana, Cherry, söz hakkından - Belirli arayüzünün, vs.) IFruit.

Soyut Fabrika deseni ile, herkesin kendi fabrikasını sağlaması için bir yol sağlarsınız. Bu, deponuzun meyve veya meyve suları hakkında herhangi bir şey bilmesini gerektirmeden bir IFruitFactoryveya bir olmasına izin verir IJuiceFactory.


5
@SPI Sanırım beni yanlış anlıyorsun; Fabrikanın kendisinin uygulamaya ihtiyacı yoktur - uygulayan IFruitşeyleri somutlaştırır IFruit. Tabii ki, belirli bir arayüzü uygulayan şeylerin örneklerini üretmeye gerek yoktur , ancak birbiriyle tamamen alakasız şeyler üreten bir Fabrikanız varsa, muhtemelen bir kod kokusu.
John Feminella

75
Fabrika üreten fabrikalar. Daha Derine
Gitmeliyiz

11
Bundan daha yanlış bir şey duymadım. Soyut fabrikaların arayüzlerini üreten bir fabrikaya ne denir (IAbstractFactory)? - ah anlıyorum, bu AbstractAbstractFactory olurdu ...
Tengiz

3
@joaquin Örneğin, IFruitFactory fabrikasına ihtiyacınız olduğunda. Daha önce de belirttiğim gibi, bu tamamen yanlış ve sadece kalıplar hakkındaki karışıklığın bir sonucudur. Aşağıdaki cevabım açıklığa kavuştu - Soyut Fabrika deseni var, o zaman Fabrika Metodu deseni var ve sonra Soyut Fabrika'nın diğer fabrikaların fabrikası anlamına geldiğini düşünen şaşkın insanlar var. Fabrika, mevcut kalıplardan herhangi birini belirtmek için kullanılan genel bir terimdir. Gerekirse daha fazla ayrıntı için aşağıdaki cevabıma bakın.
Tengiz

9
Bu cevap sadece yanlış! Bu GoF kitabına göre , soyut bir fabrika , fabrika arayüzünü uygulayan bir fabrika nesnesidir, böylece beton fabrikası başka bir alt sınıf için değiştirilebilir. Fabrikalar yaratmakla hiçbir ilgisi yok . Lütfen bu cevabı kaldırın, yanıltıcı ve kafa karıştırıcı insanlar!
Lii

142

Bu bilgilerin kaynağı: http://java.dzone.com/news/intro-design-patterns-abstract

Soyut Fabrika ve Fabrika Metodu

Bir Soyut Fabrikanın yöntemleri Fabrika Yöntemleri olarak uygulanır. Hem Soyut Fabrika Deseni hem de Fabrika Metodu Deseni, istemci sistemi gerçek uygulama sınıflarından soyut türlere ve fabrikalara dek ayırır. Fabrika Yöntemi, Soyut Fabrikanın kompozisyon yoluyla nesneleri oluşturduğu miras yoluyla nesneler oluşturur.

Soyut Fabrika Deseni bir AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct ve Client'tan oluşur.

Nasıl uygulanır?

Soyut Fabrika Deseni, Fabrika Metodu Deseni, Prototip Deseni veya Tek Ton Deseni kullanılarak uygulanabilir. ConcreteFactory nesnesi, ConcreteFactory nesnesinin yalnızca bir örneği gerektiğinden, Singleton olarak uygulanabilir.

Fabrika Metodu deseni, Soyut Fabrika deseninin basitleştirilmiş bir versiyonudur. Fabrika Metodu kalıbı bir aileye ait ürünler oluşturmaktan sorumluyken, Soyut Fabrika kalıbı birden fazla ürün ailesiyle ilgilenir.

Fabrika Yöntemi, istemciyi jeneratör sınıfından ve ortaya çıkan ürünlerden ayırmak için arabirimler ve soyut sınıflar kullanır. Abstract Factory, müşteriyi jeneratörden ve ürünlerden ayıran arayüzlerin yanı sıra çeşitli fabrika yöntemleri için bir konteyner olan bir jeneratöre sahiptir.

Fabrika Metodu Deseni Ne Zaman Kullanılmalı

Bir istemciyi kullandığı belirli bir üründen ayırmak gerektiğinde Fabrika Yöntemi desenini kullanın. Müşteriyi, ürünün örneklerini oluşturma ve yapılandırma sorumluluğunu almak için Fabrika Yöntemini kullanın.

Soyut Fabrika Deseni Ne Zaman Kullanılmalı

İstemcilerin ürün sınıflarından ayrılması gerektiğinde Özet Fabrika şablonunu kullanın. Özellikle program konfigürasyonu ve modifikasyonu için kullanışlıdır. Soyut Fabrika modeli, başkalarıyla hangi sınıfların kullanılması gerektiği konusunda da kısıtlamalar uygulayabilir. Yeni beton fabrikaları yapmak çok iş olabilir.

Örnekler:

Soyut Fabrika Örneği 1

Bir makarna üreticisinde farklı tipte makarna hazırlamak için kullanılan diskler için bu şartname Özet Fabrikasıdır ve her bir disk bir Fabrika'dır. tüm Fabrikalar (makarna üreticisi diskleri) özelliklerini soyut Fabrikadan devralır. Her disk, makarnanın nasıl oluşturulacağı bilgisini içerir ve makarna üreticisi içermez.

Soyut Fabrika Örneği 2:

Damgalama Ekipmanı, soyut ürün nesneleri oluşturan operasyonlar için bir arayüz olduğu için Soyut Fabrikaya karşılık gelir. Kalıplar, beton bir ürün oluşturdukları için Beton Fabrikasına karşılık gelir. Her parça kategorisi (Kaput, Kapı, vb.) Soyut ürüne karşılık gelir. Belirli parçalar (yani 99 camry için sürücü yan kapısı) beton ürünlere karşılık gelir.

Fabrika Yöntemi Örnek:

Oyuncak şirketi Yaratan'a karşılık gelir, çünkü fabrikayı ürün nesneleri oluşturmak için kullanabilir. Belirli bir oyuncak türü (at veya araba) üreten oyuncak şirketinin bölümü ConcreteCreator'a karşılık gelir.


6
Soyut Fabrika ve Fabrika Yöntemini açıklayan için teşekkürler. Nesneleri yaratmak için soyut fabrikada kompozisyonu nerede kullandığımızı ve fabrika yönteminde miras kullandığımızı anlamadım. Bunları açıklamak için bir kod gönderirseniz çok yararlı olacaktır. Çok teşekkür ederim. kodunu bekliyorum. Tekrar teşekkürler.
Harsha

Burada da, kompozisyon ve miras yaklaşımlarının kısa bir örnekle (kaynak kodu) gösterilmesi çok daha açık olacaktır.
Aakash


kompozisyon örneği: public class Client {AbstractProduct ürünü; Aksesuar Aksesuar; kamu Müşterisi (AbstractFactory fabrikası) {AbstractProduct ürünü = factory.createProduct (); } genel void run () {product.print (); accessories = product.getAccessories (); }}
Asim Ghaffar

Kodda bu iki modelden hangisinin kullanıldığını tespit etmek mümkün müdür?
Warlock

98

Fabrika modeli: Fabrika IP-ürün uygulamaları üretir

Soyut Fabrika Deseni: Bir fabrika fabrikası IFactories üretir, bu da IProducts üretir :)

[Yorumlara göre güncelleme]
Daha önce yazdıklarım en azından Wikipedia'ya göre doğru değil . Soyut bir fabrika sadece bir fabrika arayüzüdür. Bununla birlikte, farklı bağlamlarda farklı fabrikalara izin vermek için fabrikalarınızı çalışma zamanında değiştirebilirsiniz. Örnekler farklı işletim sistemleri, SQL sağlayıcıları, ara katman yazılımı sürücüleri vb. İçin farklı fabrikalar olabilir.


4
Güzel! Soyut Fabrikanın bir dizi Fabrika Yöntemi olduğunu söylemek doğru mu?
Warlock

2
Sanırım doğru olurdu, ama aynı zamanda noktayı da kaçırır :) Benzeri olmayan bir örnek CreateBitmapFile () veya CreateTextFile () gibi yöntemleri olan bir FileFactory olabilir. Şimdi, bir fabrikaya referans olarak bir çeşit hizmete geçeceksiniz. Ancak hizmetinizi test etmek istediğinizde ne olur? Dosya sistemine erişimi engellemek için bir IFileFactory arabirimi oluşturmanız gerekir. Şimdi, gerçek dünyada, muhtemelen ihtiyaçlarınıza göre IFileFactories'i başlatan bir DI / IoC çerçevesine sahip olacaksınız. Bu durumda IoC çerçevesi soyut fabrika görevi görecektir.
cwap

5
Doğru anlıyorsam, bu cevap Soyut Fabrika'nın her zaman daha fazla IFactories ürettiğini ima ediyor gibi görünüyor, bu da IProducts oluşturmak için kullanılabilir. GoF'taki sunum bana bunu destekliyor gibi görünmüyor ve aslında bununla çelişiyor: Bir Soyut Fabrikanın bir örneği doğrudan IPÜrünleri kendisi üretir. Başka bir deyişle, bir GoF Soyut Fabrikası bir "fabrika-fabrikası" değildir (ya da daha doğrusu olması gerekmez ).
SSJ_GZ

1
Soyut Fabrika Deseni'nin tanımı yanlış. Soyut bir fabrika, her biri aynı nesne ailesinden bir örnek üreten (nesne hiyerarşisi ile karıştırılmamalıdır) bir veya daha fazla fabrika yöntemi içerir. Soyut fabrika iken edebilir fabrikaların bir fabrika olması, bu biri olmak zorunda değildir. İlgili ürünlerin üreticisidir.
GiddyUpHorsey

1
Bu cevap sadece yanlış! Bu GoF kitabına göre , soyut bir fabrika , fabrika arayüzünü uygulayan bir fabrika nesnesidir, böylece beton fabrikası başka bir alt sınıf için değiştirilebilir. Fabrikalar yaratmakla hiçbir ilgisi yok . Lütfen bu cevabı kaldırın, yanıltıcı ve kafa karıştırıcı insanlar!
Lii

42

Soyut fabrika modeli

  • Somut sınıflarını belirtmeden ilgili veya bağımlı nesnelerin ailelerini oluşturmak için bir arayüz sağlayın.

  • Soyut Fabrika modeli, Fabrika Yöntemi desenine çok benzer. İkisi arasındaki farklardan biri, Soyut Fabrika modeli ile, bir sınıfın, nesne yoluyla örnekleme sorumluluğunu kompozisyon yoluyla başka bir nesneye devrederken, Fabrika Yöntemi modeli miras kullanır ve istenen nesne örneğini işlemek için bir alt sınıfa dayanır.

  • Aslında, devredilen nesne, örneği gerçekleştirmek için sık sık fabrika yöntemlerini kullanır!

Fabrika desen

  • Fabrika kalıpları yaratıcı kalıplara örnektir

  • Yaratıcı kalıplar nesne örnekleme sürecini soyutlar. Nesnelerin nasıl oluşturulduğunu gizlerler ve genel sistemi nesnelerinin nasıl oluşturulduğundan ve oluşturulduğundan bağımsız hale getirmeye yardımcı olurlar.

  • Sınıf yaratıcı örüntüler, örneklenecek nesneye karar vermek için kalıtım kullanımına odaklanır Fabrika Yöntemi

  • Nesne yaratıcı kalıpları, başka bir nesneye örneklemenin temsil edilmesine odaklanır Özet Fabrika

Referans: Fabrika vs Soyut Fabrika


3
referans bağlantısı öldü
mkobit

39

Fabrika yöntemi: Belirli bir temel sınıftan türetilen nesneler oluşturan bir fabrikanız var

Soyut fabrika: Başka fabrikalar yaratan bir fabrikanız var ve bu fabrikalar da temel sınıflardan türetilen nesneler yaratıyor. Bunu yaparsınız çünkü genellikle tek bir nesne oluşturmak istemezsiniz (Fabrika yönteminde olduğu gibi) - bunun yerine, ilgili nesnelerin bir koleksiyonunu oluşturmak istersiniz.


6
Bu, kabul edilen cevabın bir kopyasıdır ve aynı derecede yanlıştır.
jaco0646

36

Soyut fabrika ilgili nesneleri oluşturmak için bir arayüz, ancak fabrika yöntemi bir yöntemdir. Soyut fabrika fabrika yöntemiyle uygulanır.

resim açıklamasını buraya girin


36

Temel fark:

Fabrika: Örnekleme mantığını istemciye göstermeden nesneler oluşturur.

Fabrika Yöntemi : Nesne oluşturmak için bir arabirim tanımlayın, ancak alt sınıfların hangi sınıfı başlatacağına karar vermesine izin verin. Fabrika yöntemi, bir sınıfın alt sınıflara örnek oluşturmayı ertelemesini sağlar

Abstract Factory : Somut sınıflarını belirtmeden ilgili veya bağımlı nesnelerin ailelerini oluşturmak için bir arayüz sağlar.

AbstractFactory deseni, nesne oluşturma sorumluluğunu başka bir sınıfa devretmek için kompozisyonu kullanırken Fabrika yöntemi deseni miras kullanır ve nesne oluşturmak için türetilmiş sınıf veya alt sınıfa dayanır

Gönderen oodesign makaleleri:

Fabrika sınıfı diyagramı:

resim açıklamasını buraya girin

Örnek: StaticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

Statik Olmayan Fabrika uygulayan FactoryMethod örneği bu yayında mevcuttur:

Tasarım Desenleri: Fabrika vs Fabrika yöntemi vs Soyut Fabrika

Ne zaman kullanılır: Müşteri sadece bir sınıfa ihtiyaç duyar ve hangi somut uygulamayı aldığını umursamaz.

Fabrika Yöntemi sınıf digaram:

resim açıklamasını buraya girin

Ne zaman kullanılır: Müşteri, çalışma zamanında hangi somut sınıflar oluşturmanız gerektiğini bilmez, ancak sadece işi yapacak bir sınıf almak ister.

Dzone soyut fabrika sınıfı diyagramı

resim açıklamasını buraya girin

Ne zaman kullanılır: Sisteminizin birden fazla ürün ailesi oluşturması gerektiğinde veya uygulama ayrıntılarını göstermeden bir ürün kitaplığı sağlamak istediğinizde.

Yukarıdaki makalelerde yer alan kaynak kodu örnekleri, kavramları açıkça anlamak için çok iyidir.

Kod örneği ile ilgili SE sorusu:

Fabrika düzeni. Fabrika yöntemleri ne zaman kullanılır?

farklılıklar:

  1. Özet Fabrika sınıfları genellikle Fabrika Yöntemleri ile uygulanır, ancak Prototip kullanılarak da uygulanabilir
  2. Tasarımlar, Fabrika Yöntemi (daha az karmaşık, daha özelleştirilebilir, alt sınıflar çoğalır) kullanılarak başlar ve daha fazla esnekliğe ihtiyaç duyulan diğer yaratıcı modellere (daha esnek, daha karmaşık) doğru gelişir.
  3. Fabrika Yöntemleri genellikle Şablon Yöntemleri içinde çağrılır.

Diğer faydalı makaleler:

sourcemaking'den factory_method

abstract_factory sourcemaking dan

journaldev soyut-fabrika-tasarım-desen


21

Soyut Fabrika Örneği / Senaryosu

Yağmurlu mevsimde yağmur yağan, kışın kar yağan, yazları sıcak ve güneşli bir yerde yaşıyorum. Kendimi elementlerden korumak için farklı kıyafetlere ihtiyacım var. Bunu yapmak için evimin yakınındaki dükkana gidip kendimi korumak için kıyafet / eşya istiyorum. Mağaza bekçisi bana cebimin ortamına ve derinliğine göre uygun ürünü veriyor. Bana verdiği eşyalar aynı kalite ve fiyat aralığında. Standartlarımın farkında olduğundan bunu yapması kolaydır. Ancak caddenin dört bir yanından gelen zengin bir adam aynı gereksinimleri karşıladığında pahalı ve markalı bir eşya alır. Göze çarpan bir şey, bana verdiği tüm eşyalar, kalite, standart ve maliyet açısından birbirini tamamlıyor. Birbirleri ile gittiklerini söyleyebiliriz. Bu zengin adamın aldığı eşyalarda da durum aynı.

Bu yüzden yukarıdaki senaryoya bakarak, mağaza sahibinin verimliliğini takdir ediyorum. Bu dükkan sahibini bir Soyut Dükkan ile değiştirebilirim. Soyut öğelerle aldığımız eşyalar ve ben ve zengin perspektif müşterileri olarak. İhtiyacımız olan tek şey ihtiyaçlarımıza uyan ürün / eşya.

Şimdi kendimi çok sayıda müşteriye bir dizi hizmet sunan bir çevrimiçi mağaza düşünürken kolayca görebiliyorum. Her müşteri üç gruptan birine aittir. Bir premium grup kullanıcısı siteyi açtığında harika kullanıcı arayüzü, son derece özelleştirilmiş reklam bölmesi, menülerde daha fazla seçenek vb. ve biraz daha az egronomik kullanıcı arayüzü. Son olarak benim türüm, 'özgür grup' kullanıcısı. Ben sadece rahatsız olsun ki yeterince hizmet. Kullanıcı Arayüzü çıplak bir minimumdur, reklamlar yoldan çok fazladır, böylece ne geldiğini bilmiyorum, son olarak menü sadece oturumu kapatmıştır.

Bu web sitesi gibi bir şey inşa etme şansım olursa, kesinlikle Soyut Fabrika Deseni'ni düşünürüm.

Soyut Ürünler: Reklam Panosu, Menü, UI ressam.
Özet Fabrika: Web Mağazası Kullanıcı Deneyimi
Concreate Factory: Üstün Kullanıcı Deneyimi, Altın Kullanıcı Deneyimi, Genel Kullanıcı Deneyimi.


AbstractFactory'nin güzel senaryoları ama soruyu gerçekten cevaplamadınız, fabrika ve soyut fabrika arasındaki farklar nelerdir.
Adelin

20

Birçok insan belki şaşıracak, ama bu soru yanlış . Bir görüşme sırasında bu soruyu duyarsanız, görüşmecinin karışıklığın nerede olduğunu anlamasına yardımcı olmanız gerekir.

Sadece "Fabrika" adı verilen somut bir model olmadığı gerçeğinden başlayalım. "Soyut Fabrika" adı verilen bir desen vardır ve "Fabrika Metodu" olarak adlandırılan bir desen vardır.

Peki, "Fabrika" ne demek? aşağıdakilerden biri (referansın kapsamına bağlı olarak hepsi doğru kabul edilebilir):

  • Bazı insanlar bunu " Soyut Fabrika " için bir takma ad (kısayol) olarak kullanır .
  • Bazı insanlar bunu " Fabrika Yöntemi " için bir takma ad (kısayol) olarak kullanır .
  • Bazı insanlar bunu tüm fabrika / yaratıcı desenler için daha genel bir isim olarak kullanır. Örneğin "Soyut Fabrika" ve "Fabrika Metodu" fabrikalardır.

Ve ne yazık ki , birçok kişi fabrika veya fabrikalar (veya arabirimleri) oluşturan başka bir fabrika türünü belirtmek için "Fabrika" kullanır. Teorilerine dayanarak:

Ürün, Factory tarafından oluşturulan ve AbstractFactory tarafından oluşturulan IFactory'yi uygulayan IProduct'u uygular.

Bunun ne kadar aptalca olduğunu anlamak için denklemimize devam edelim:

AbstractFactory tarafından oluşturulan IAbstractFactory uygular ... AbstractAbstractFactory ???

Umarım amacı görürsün. Kafanız karışmasın, lütfen sebepsiz var olmayan şeyleri icat etmeyin.

-

PS : Ürünler için Fabrika AbstractFactory ve Soyut Fabrikalar için Fabrika da AbstractFactory başka bir örnek olacaktır.


diğer AbstractFactories'i oluşturan AbstractFactory'yi, belirli nesneleri oluşturan AbstractFactory'den nasıl ayırt edebilirim? GenericAbstractFactory? Veya AbstractFactoryFactory?
Andrew

Tasarım modellerinde böyle bir şey yoktur. Her ikisi de AbstractFactory deseninin örnekleridir. Bu nedenle, bir AbstractFactory belirli nesneler oluşturur ve başka bir AbstractFactory fabrikalar oluşturur (bunlar yine AbstractFactory'dir).
Tengiz

Elbette. Öyleyse farklı şeyler yapan bu sınıfları nasıl adlandırırım? Çünkü başka fabrikalar yaratmak ve başka (basit) nesneler yaratmak iki farklı şeydir. Desenler umrumda değil, okunabilir koda ihtiyacım var.
Andrew

3
Okunabilir kod niyeti ortaya koyan koddur. Sınıfları adlandırırken çok gerekli olmadıkça çok fazla kalıptan bahsetmemelisiniz. örneğin, farklı nakliyeler yaratan soyut bir fabrikanız varsa, belki TransportCreator veya TransportFactory, hatta TransportManufacturer olarak adlandırın. Ve sonra, bu fabrikaların fabrikasına sahipseniz, her ne olursa olsun - yeni üreticileri açan herkes diyebilirsiniz. Belki bu ManufacturerManagement olabilir? temel olarak, işletmelerinizin dediği şeyleri adlandırın ve uyguladıkları kalıplara dayalı DEĞİL.
Tengiz

16
//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{    
   public Dough createDough(); //Will return you family of Dough
   public Clam createClam();   //Will return you family of Clam
   public Sauce createSauce(); //Will return you family of Sauce
}

class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{

   @Override
   public Dough createDough(){
      //create the concrete dough instance that NY uses
      return doughInstance;
   }

   //override other methods
} 

Ders kitabı tanımları diğer yanıtlar tarafından verilmiştir. Ben de buna bir örnek vereceğimi düşündüm.

İşte ilgili ürün ailesi oluşturmak için yöntemler sağladığı PizzaIngredientsFactoryiçin soyut bir fabrika .

Soyut fabrikadaki her yöntemin kendi başına bir Fabrika yöntemi olduğuna dikkat edin . Gibi createDough()kendi içinde olan somut uygulamaları gibi alt sınıflar tarafından sağlanacaktır fabrika yöntemidir NYPizzaIngredientsFactory. Yani bunu kullanarak her farklı konum, konumlarına ait somut içerik örnekleri oluşturabilir.

Fabrika Yöntemi

Somut uygulama örneği sağlar

Örnekte:
- createDough()- hamur için somut uygulama sağlar. Bu bir fabrika yöntemidir

Soyut Fabrika

İlgili nesnelerin ailesini oluşturmak için arabirim sağlar

Örnekte:
- PizzaIngredientsFactoryneye nesnelerin ilgili kümesi oluşturmak için izin verdiği soyut fabrika Dough, Clams, Sauce. Her nesne ailesini oluşturmak için bir fabrika yöntemi sağlar.

Örnek Kafa İlk tasarım desenleri


5

John'un cevabına şu şekilde katkıda bulunabileceğim bazı noktalar var:

Soyut fabrika fabrikaların bir fabrika!

(Sadece "Fabrika" belirsiz olduğu için) "Fabrika Yöntemi" ile, uygulamaları (üretmek Lemon, Orange, söz hakkından - Belirli arayüzünün, vs.) IFruit. Bu Fabrika denilebilir CitricFruitFactory.

Ancak şimdi CitricFruitFactory'nin oluşturamayacağı başka bir meyve türü oluşturmak istiyorsunuz. Belki de içinde bir tane oluşturursanız kodu CitricFruitFactorymantıklı olmaz Strawberry(çilek sitrik bir meyve değildir!).

Eğer adlı yeni Fabrikası yaratabilecek Yani RedFruitFactoryüretir Strawberry, Raspberryvb

John Feminella'nın dediği gibi: "Soyut Fabrika deseni ile, belirli bir Fabrika arayüzünün uygulamalarını üretiyorsunuz - örneğin, IFruitFactoryher biri farklı meyve türlerinin nasıl yaratılacağını biliyor."

Ait implementatios O IFruitFactoryvardır CitricFruitFactoryve RedFruitFactory!


4

: My kaynaklarıdır StackOverflow, tutorialspoint.com, programmers.stackexchange.comve CodeProject.com.


Factory Method(ayrıca denir Factory) bir Interfaceuygulamanın istemcisi ayrıştırmak içindir . Örnek Shapeiçin iki Circleve bir Squareuygulama içeren bir arayüzümüz var . Arabirimin Typeyeni ilgili uygulaması gibi bir belirleyici parametresi olan bir fabrika yöntemiyle bir fabrika sınıfı tanımladık Shape.


Abstract Factorybirçok fabrika yöntemi veya bir fabrika arayüzü içerir. Yukarıdaki örnek Coloriçin iki Redve bir Yellowuygulama içeren bir arayüzümüz var . Biz tanımlamak zorunda ShapeColorFactoryikisiyle arayüzü RedCircleFactoryve YellowSquareFactory. Bu kavramı açıklamak için aşağıdaki kod:

interface ShapeColorFactory
{
    public Shape getShape();
    public Color getColor();
}

class RedCircleFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Circle();
    }

    @Override
    public Color getColor() {
        return new Red();
    }
}
class YellowSquareFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Square();
    }

    @Override
    public Color getColor() {
        return new Yellow();
    }
} 

Burada FactoryMethodve arasındaki fark AbstractFactory. Factory Methodolarak basit bir arayüzde ama somut bir sınıfını dönmek Abstract Factorydönüş factory of factory. Başka bir deyişle Abstract Factory, bir dizi arayüzün farklı birleşimini döndürür.


Umarım açıklamam faydalı olur.


3

Bu fabrikalardaki en büyük fark fabrikalarla ne yapmak istediğiniz ve ne zaman kullanmak istediğinizdir.

Bazen, IOC (kontrolün tersine çevrilmesi, örneğin yapıcı enjeksiyonu) yaparken, katı nesneler oluşturabileceğinizi bilirsiniz. Yukarıdaki örnekte belirtildiği gibi, meyve nesneleri oluşturmaya hazırsanız, basit fabrika desenini kullanabilirsiniz .

Ancak birçok kez, katı nesneler oluşturmak istemezsiniz, daha sonra program akışına gelirler. Ancak yapılandırma, başlangıçta ne tür bir fabrika kullanmak istediğinizi söyler, nesneler oluşturmak yerine, ortak bir fabrika sınıfından türetilen fabrikaları IOC'deki yapıcıya aktarabilirsiniz.

Bu yüzden, aynı zamanda nesnenin ömrü ve yaratımı ile ilgili olduğunu düşünüyorum.


3

Hem Factory Methodve Abstract Factorybeton türlerinden ayrılmış istemciler tutun. Her ikisi de nesne oluşturur, ancak Factoryyöntem kalıtım Abstract Factorykullanır, kompozisyon kullanır .

Factory MethodOysa somut nesneler (ürünler) oluşturmak için, alt sınıflar içinde kalıtsal Abstract Factorybir ürün ve bu ara yüzünün alt sınıfına ait aile oluşturmak için bir arabirim sağlar ilgili ürünler oluşturma tanımlar.

Daha sonra bu alt sınıflar örneklendiğinde soyut tür olarak kullanıldığı ürün sınıflarına geçirilir. Bir ilgili ürünler Abstract Factorygenellikle kullanılarak uygulanır Factory Method.


3

John Feminella cevabını genişletmek:

Apple, Banana, CherryUygular FruitFactoryve bu adlı bir yöntem vardır CreateApple veya muz veya Kiraz yaratma sorumludur. İşleminiz bitti Factory.

Şimdi, Createmeyvelerinizden özel bir salata almak istiyorsunuz ve Soyut Fabrikanız geliyor . Abstract Factory, Apple, Banana ve Cherry'den özel Salatanızı nasıl oluşturacağınızı biliyor.

public class Apple implements Fruit, FruitFactory {
    public Fruit Create() {
        // Apple creation logic goes here
    }
}

public class Banana implements Fruit, FruitFactory {
    public Fruit Create() {
        // Banana creation logic goes here
    }
}

public class Cherry implements Fruit, FruitFactory {
    public Fruit Create() {
        // Cherry creation logic goes here
    }
}

public class SpecialSalad implements Salad, SaladFactory {
    public static Salad Create(FruitFactory[] fruits) {
        // loop through the factory and create the fruits.
        // then you're ready to cut and slice your fruits 
        // to create your special salad.
    }
}

2

Tanımı ile ikisinin farklarını sürükleyebiliriz:

Fabrika: Nesne oluşturmak için bir arabirim kullanılır, ancak alt sınıf hangi sınıfın örnekleneceğine karar verir. Nesnenin oluşturulması gerektiğinde yapılır.

Soyut Fabrika: Soyut Fabrika desen diğer fabrikalar yaratan bir süper fabrika gibi davranır. Soyut Fabrika modelinde, bir arayüz, somut sınıflarını belirtmeden bir dizi ilgili nesne veya bağımlı nesne oluşturmaktan sorumludur.

Dolayısıyla, yukarıdaki tanımlarda belirli bir fark üzerinde durabiliriz. yani, Fabrika deseni nesneler oluşturmaktan sorumludur ve Soyut Fabrika ilgili nesneler kümesi oluşturmaktan sorumludur; belli ki ikisi de bir arayüz üzerinden.

Fabrika desen:

public interface IFactory{
  void VehicleType(string n);
 }

 public class Scooter : IFactory{
  public void VehicleType(string n){
   Console.WriteLine("Vehicle type: " + n);
  }
 }

 public class Bike : IFactory{
  public void VehicleType(string n) {
  Console.WriteLine("Vehicle type: " + n);
  }
 }

 public interface IVehicleFactory{
  IFactory GetVehicleType(string Vehicle);
 }

 public class ConcreteVehicleFactory : IVehicleFactory{
 public IFactory GetVehicleType(string Vehicle){
   switch (Vehicle){
    case "Scooter":
     return new Scooter();
    case "Bike":
     return new Bike();
    default:
    return new Scooter();
  }
 }

 class Program{
  static void Main(string[] args){
   IVehicleFactory factory = new ConcreteVehicleFactory();
   IFactory scooter = factory.GetVehicleType("Scooter");
   scooter.VehicleType("Scooter");

   IFactory bike = factory.GetVehicleType("Bike");
   bike.VehicleType("Bike");

   Console.ReadKey();
 }
}

Soyut fabrika desen:

interface IVehicleFactory{
 IBike GetBike();
 IScooter GetScooter();
}

class HondaFactory : IVehicleFactory{
     public IBike GetBike(){
            return new FZS();
     }
     public IScooter GetScooter(){
            return new FZscooter();
     }
 }
class HeroFactory: IVehicleFactory{
      public IBike GetBike(){
            return new Pulsur();
     }
      public IScooter GetScooter(){
            return new PulsurScooter();
     }
}

interface IBike
    {
        string Name();
    }
interface IScooter
    {
        string Name();
    }

class FZS:IBike{
   public string Name(){
     return "FZS";
   }
}
class Pulsur:IBike{
   public string Name(){
     return "Pulsur";
   }
}

class FZscooter:IScooter {
  public string Name(){
     return "FZscooter";
   }
}

class PulsurScooter:IScooter{
  public string Name(){
     return "PulsurScooter";
   }
}

enum MANUFACTURERS
{
    HONDA,
    HERO
}

class VehicleTypeCheck{
        IBike bike;
        IScooter scooter;
        IVehicleFactory factory;
        MANUFACTURERS manu;

        public VehicleTypeCheck(MANUFACTURERS m){
            manu = m;
        }

        public void CheckProducts()
        {
            switch (manu){
                case MANUFACTURERS.HONDA:
                    factory = new HondaFactory();
                    break;
                case MANUFACTURERS.HERO:
                    factory = new HeroFactory();
                    break;
            }

      Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " +      factory.GetScooter().Name());
        }
  }

class Program
    {
        static void Main(string[] args)
        {
            VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
            chk.CheckProducts();

            chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
            chk.CheckProducts();

            Console.Read();
        }
    }


1

Soyut fabrika farklı türde arabirimler oluşturmak için bir şablondur. Varsayalım, miktar, fiyat ve öğeye özgü farklı türlerde csv dosyalarını ayrıştırmanızı gerektiren bir projeniz var ve bazı çikolatalar hakkında diğer meyveler hakkında veriler içeriyor ve ayrıştırmadan sonra ilgili bilgileri bu veritabanında güncellemelisiniz, böylece ayrıştırıcı ve değiştirici fabrika dönen bir soyut fabrika ve daha sonra bu ayrıştırıcı fabrika size Çikolata ayrıştırıcı nesne, Meyve Ayrıştırıcı Nesne vb dönebilir ve benzer şekilde Değiştirici Fabrika Çikolata değiştirici nesne, Meyve Değiştirici nesne vb.


1

Java8 örnek kodunu görerek bu ikisi arasındaki farkı anlayabileceğimizi düşünüyorum:

  interface Something{}

  interface OneWhoCanProvideSomething {
     Something getSomething();
  }

  interface OneWhoCanProvideCreatorsOfSomething{
     OneWhoCanProvideSomething getCreator();
  }


public class AbstractFactoryExample {

    public static void main(String[] args) {
        //I need something
        //Let's create one
        Something something = new Something() {};

        //Or ask someone (FACTORY pattern)
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;

        //Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
        OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;

        //Same thing, but you don't need to write you own interfaces
        Supplier<Something> supplierOfSomething = () -> null;
        Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
    }

}

Şimdi soru, hangi yaratım yolunu kullanmanız gerektiği ve neden: İlk yol (desen yok, sadece düz yapıcı): kendiniz oluşturmak iyi bir fikir değil, tüm işi yapmanız gerekiyor ve müşteri kodunuz bağlı özel uygulama.

İkinci yol (Fabrika kalıbını kullanarak): size, bazı koşullara (belki de yaratıcılık yöntemine geçirilen bir parametre) göre farklı bir şey türü sağlayabilen herhangi bir uygulama türünü geçebilmenizi sağlar.

Üçüncü yol (Abstract Factory pattern kullanarak): Bu size daha fazla esneklik sağlar. Bazı koşullara bağlı olarak bir şeyin farklı içerik oluşturucularını bulabilirsiniz (belki bir parametre geçti).

Her zaman iki koşulu bir araya getirerek (kod karmaşıklığını ve bağlantıyı hafifçe arttırır) Fabrika modeliyle her zaman uzaklaşabileceğinizi unutmayın, sanırım bu yüzden Soyut Fabrika deseninin gerçek yaşam kullanım durumlarını nadiren görüyoruz.

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.