Bu tasarım deseninin bir açıklamasını ve kod örneğini bir araya getiriyorum; etrafımdaki diğer kişilere yardım etmeyi denemeye çalışıyorum (ayrıca kalıba hakim olmama yardımcı olmakla birlikte).Fabrika Tasarım Örneği (gereklilik eleştirisi)
Aramak istediklerim & veya benim açıklama ve kod örnekimin eleştirisi ... teşekkürler!
Fabrika modeli nedir? Fabrika düzeni, gerçek bir dünya fabrikasına benzer şekilde - nesnelerin oluşturulmasının - ve çoğu kez - oluşturulmasının işlenmesi için özel bir "nesne yaratıcısı nesnesi" kullanır. otomobillerin çeşitli yaratıcısı olan bir otomobil fabrikasının
Gerçek hayattan örnek
düşünün. Bu otomobil fabrikasındaki montaj hatlarından biri bir gün bir kamyon üretebilir, ancak başka bir günde araba üretmek için yeniden kullanılabilir. Bir bayilikten, tahsis edilen hesap işlem departmanına 10 araba siparişi verdiğinizi varsayalım. Bu departman belli bir fabrikayı kullanır ve 10 araba sipariş eder. Hesap işleyicileri, otomobilleri kendileri yapmakla (kötü sonuçları hayal etmemekle) ilgilenmezler, sadece son ürünle çalışırlar, bayilerin araçlarını almasını sağlarlar.
Gelecek yıl aynı otomobilin yeni bir modeli ortaya çıkıyor ve siparişler akmaya başlıyor. Hesap işleyicileri (hala otomobil üretimiyle ilgili değil) siparişleri yerleştiriyorlar, ancak şimdi aldıkları araba farklı. montaj yöntemi veya belki de fabrika tamamen farklı olabilir, ancak hesap işleyicileri bunun için endişelenmemelidir. Ek bir düşünce: Araçların fabrika montajcıları, belirli bir hesap işleyicisi bir sipariş verdiğinde (örneğin hesap işleyicisi X bir sipariş verdiğinde, ne yapması gerektiğini tam olarak bilir), fabrika montajcısı, hesap işleyicisi X için, Y tipi 10 araç ürettiklerini bilir). Başka bir seçenek, hesap işleyicisinin, montajcıya tam olarak ne tür bir araç üreteceğini söylemesi olabilir.
Hesap işleyicileri de taşıtların oluşturulmasını ele geçirdiyse (diğer bir deyişle, eşleştirildiklerinde), bir araç herhangi bir şekilde her değiştiğinde, her bir hesap işleyicisinin bu aracı üretirken yeniden incelenmesi gerekir. Bu, kalite sorunları yaratacaktır, çünkü fabrikalardan çok daha fazla hesap işleyicisi vardır ... hatalar olur, masraf çok daha büyük olur. OOP geri Turlu
yazılım mühendisliği uygulanmış bir tasarım deseni konsepti yukarıdaki örneğe benzer olarak bir nesne fabrika ... fabrika diğer nesnelerin çeşitli yayıklar, bir montaj hattı kullanabilir (nesne Belirli bir nesne türünü üreten assembler), belirli bir şekilde döndü. Birleştirici, istekte bulunan istemciyi denetleyebilir ve işleyebilir veya istemci, assembler'a hangi nesnenin gerektirdiğini söyleyebilir. Şimdi ... bir projede bulunuyorsunuz ve bir nesne fabrikası ve çeşitli montajcılar yaratıyorsunuz, daha sonra projedeki yolda ilerliyorsunuz, gereksinimler biraz değişiyor, artık nesne içeriklerini ve müşterilerinin bu nesneyi nasıl ele aldıklarını değiştirmeniz isteniyor. Fabrika modelini kullandığınız için bu basit bir değişikliktir ve tek bir konumda, fabrikanın ürettiği nesneleri değiştirebilir veya ekleyebilirsiniz ve birleştiricilerin nesne içeriğini dışarıda bıraktığı biçimi değiştirebilirsiniz.
Bunu yapmanın talihsiz yolu, bir fabrika yöntemi olmaksızın, her nesne örneğini başlatıp, istemcilerin kendileri içindekileri biçimlendirmek olurdu ... bu belirli nesneyi 20 istemciden kullandığını söylüyorsunuz. Şimdi her bir müşteriye gitmeli, nesne örneklerini ve formatlarını değiştirmelisin ... ne zaman kaybı ... Ne tembel ol ... ilk kez doğru şekilde yap, böylece kendini (ve başkalarını) kurtar ve daha sonra çaba.
Kod örneği (C#)
Aşağıda gıda ve çeşitli yiyecek için bir fabrika kullanan bir örnektir
Factory module
public enum FoodType
{
//enumerated foodtype value, if client wants to specify type of object, coupling still occurs
Hamburger, Pizza, HotDog
}
/// <summary>
/// Object to be overridden (logical)
/// </summary>
public abstract class Food
{
public abstract double FoodPrice { get; }
}
/// <summary>
/// Factory object to be overridden (logical)
/// </summary>
public abstract class FoodFactory
{
public abstract Food CreateFood(FoodType type);
}
//-------------------------------------------------------------------------
#region various food objects
class Hamburger : Food
{
double _foodPrice = 3.59;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
class Pizza : Food
{
double _foodPrice = 2.49;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
class HotDog : Food
{
double _foodPrice = 1.49;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
#endregion
//--------------------------------------------------------------------------
/// <summary>
/// Physical factory
/// </summary>
public class ConcreteFoodFactory : FoodFactory
{
public override Food CreateFood(FoodType foodType)
{
switch (foodType)
{
case FoodType.Hamburger:
return new Hamburger();
break;
case FoodType.HotDog:
return new HotDog();
break;
case FoodType.Pizza:
return new Pizza();
break;
default:
return null;
break;
}
}
}
/// <summary>
/// Assemblers
/// </summary>
public class FoodAssembler
{
public string AssembleFoodAsString(object sender, FoodFactory factory)
{
Food food = factory.CreateFood(FoodType.Hamburger);
if (sender.GetType().Name == "default_aspx")
{
return string.Format("The price for the hamburger is: ${0}", food.FoodPrice.ToString());
}
else
{
return food.FoodPrice.ToString();
}
}
public Food AssembleFoodObject(FoodFactory factory)
{
Food food = factory.CreateFood(FoodType.Hamburger);
return food;
}
}
Calling factory
FoodFactory factory = new ConcreteFoodFactory(); //create an instance of the factoryenter code here
lblUser.Text = new FoodAssembler().AssembleFoodAsString(this, factory); //call the assembler which formats for string output
Object o = new FoodAssembler().AssembleFoodObject(factory); //example: instantiating anon object, initialized with created food object
Topluluk wiki, belki? –
Niçin yakın oy? Soru biraz uzun olmasına rağmen, bu geçerlidir, – jgauffin