Fabrika ve Soyut Fabrika Kalıpları arasındaki temel fark nedir?
createThing()
) Kullanması ve Abstract Factory kompozisyon (dolaylı yatay örn. getFactory().createThing()
)
Fabrika ve Soyut Fabrika Kalıpları arasındaki temel fark nedir?
createThing()
) Kullanması ve Abstract Factory kompozisyon (dolaylı yatay örn. getFactory().createThing()
)
Yanıtlar:
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 IFruitFactory
veya bir olmasına izin verir IJuiceFactory
.
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.
Bu bilgilerin kaynağı: http://java.dzone.com/news/intro-design-patterns-abstract
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.
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.
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.
İ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.
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.
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.
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.
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.
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 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
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.
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.
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ı:
Ö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:
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ı
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:
Diğer faydalı makaleler:
sourcemaking'den factory_method
abstract_factory sourcemaking dan
journaldev soyut-fabrika-tasarım-desen
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.
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):
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.
//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ığı PizzaIngredientsFactory
iç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.
Somut uygulama örneği sağlar
Örnekte:
- createDough()
- hamur için somut uygulama sağlar. Bu bir fabrika yöntemidir
İlgili nesnelerin ailesini oluşturmak için arabirim sağlar
Örnekte:
- PizzaIngredientsFactory
neye 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.
John'un cevabına şu şekilde katkıda bulunabileceğim bazı noktalar var:
(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 CitricFruitFactory
mantıklı olmaz Strawberry
(çilek sitrik bir meyve değildir!).
Eğer adlı yeni Fabrikası yaratabilecek Yani RedFruitFactory
üretir Strawberry
, Raspberry
vb
John Feminella'nın dediği gibi:
"Soyut Fabrika deseni ile, belirli bir Fabrika arayüzünün uygulamalarını üretiyorsunuz - örneğin, IFruitFactory
her biri farklı meyve türlerinin nasıl yaratılacağını biliyor."
Ait implementatios O IFruitFactory
vardır CitricFruitFactory
ve RedFruitFactory
!
: My kaynaklarıdır StackOverflow
, tutorialspoint.com
, programmers.stackexchange.com
ve CodeProject.com
.
Factory Method
(ayrıca denir Factory
) bir Interface
uygulamanın istemcisi ayrıştırmak içindir . Örnek Shape
için iki Circle
ve bir Square
uygulama içeren bir arayüzümüz var . Arabirimin Type
yeni ilgili uygulaması gibi bir belirleyici parametresi olan bir fabrika yöntemiyle bir fabrika sınıfı tanımladık Shape
.
Abstract Factory
birçok fabrika yöntemi veya bir fabrika arayüzü içerir. Yukarıdaki örnek Color
için iki Red
ve bir Yellow
uygulama içeren bir arayüzümüz var . Biz tanımlamak zorunda ShapeColorFactory
ikisiyle arayüzü RedCircleFactory
ve 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 FactoryMethod
ve arasındaki fark AbstractFactory
. Factory Method
olarak basit bir arayüzde ama somut bir sınıfını dönmek Abstract Factory
dö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.
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.
Hem Factory Method
ve Abstract Factory
beton türlerinden ayrılmış istemciler tutun. Her ikisi de nesne oluşturur, ancak Factory
yöntem kalıtım Abstract Factory
kullanır, kompozisyon kullanır .
Factory Method
Oysa somut nesneler (ürünler) oluşturmak için, alt sınıflar içinde kalıtsal Abstract Factory
bir ü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 Factory
genellikle kullanılarak uygulanır Factory Method
.
John Feminella cevabını genişletmek:
Apple
, Banana
, Cherry
Uygular FruitFactory
ve bu adlı bir yöntem vardır Create
Apple veya muz veya Kiraz yaratma sorumludur. İşleminiz bitti Factory
.
Şimdi, Create
meyvelerinizden ö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.
}
}
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();
}
}
Buraya bakın: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htm Fabrika yönteminin temel sınıf olarak belirli bir sınıf (soyut değil) kullandığı anlaşılırken, Abstract fabrika bunun için soyut bir sınıf kullanıyor. Ayrıca soyut sınıf yerine bir arayüz kullanılıyorsa sonuç, Soyut Fabrika modelinin farklı bir uygulaması olacaktır.
: D
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.
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.