Tasarım Desenleri - Fabrika Metodu (Factory Method)Beğendin
Fabrika metodu yaratıcı desen grubuna girer. Oldukça yaygın kullanılmaktadır. Amacımız, bir nesneyi tanımlamak için bir arabirim veya soyut sınıf tanımlamak ancak hangi sınıftan nesne oluşturulacağı kararını alt sınıflara bırakmaktır.
Örneğin aşağıdaki gibi soyut bir enstrüman sınıfı ve bu sınıftan türeyen bazı enstrümanları tanımlayalım.
public abstract class Instrument
{
public virtual void Play()
{
Console.WriteLine($"{GetType().Name} played.");
}
}
public class BassGuitar : Instrument
{
}
public class ClassicalGuitar : Instrument
{
}
public class Drums : Instrument
{
}
public class ElectricGuitar : Instrument
{
}
public class Keyboard : Instrument
{
}
Daha sonra bu enstrümanları kullanacak olan müzik gruplarını temsil edecek bir soyut sınıf oluşturalım.
public abstract class Band
{
protected Instrument[] instruments;
protected Band()
{
CreateInstruments();
}
public void Play()
{
Console.WriteLine(GetType().Name + " starts playing...");
foreach (var instrument in instruments)
{
instrument.Play();
}
Console.WriteLine(GetType().Name + " ends playing.\n");
}
public abstract void CreateInstruments();
}
Bu sınıftaki "CreateInstruments" metodu fabrika metodunun bizzat kendisidir. Buradaki önemli nokta bu fabrika metodunun yine aynı sınıftan çağırılıyor olmasıdır. Biz burada constructor içerisinde çağırıyoruz.
Son olarak bu sınıftan türeyen bir Rock grubu ve Flamenko grubu tanımlayalım.
public class RockBand : Band
{
public override void CreateInstruments()
{
instruments = new Instrument[]
{
new BassGuitar(),
new Drums(),
new ElectricGuitar(),
new Keyboard()
};
}
}
public class FlamencoBand : Band
{
public override void CreateInstruments()
{
instruments = new Instrument[]
{
new ClassicalGuitar(),
new ClassicalGuitar()
};
}
}
Burada, grubun hangi enstrümanlardan oluşacağına alt sınıflar karar veriyor. Aşağıdaki gibi kullanalım.
var bands = new Band[2]
{
new RockBand(),
new FlamencoBand()
};
foreach (var band in bands)
{
band.Play();
}
Çıktı aşağıdaki gibi olacaktır:
RockBand starts playing... BassGuitar played. Drums played. ElectricGuitar played. Keyboard played. RockBand ends playing. FlamencoBand starts playing... ClassicalGuitar played. ClassicalGuitar played. FlamencoBand ends playing.
Örnek kodlara bu link üzerinden ulaşabilirsiniz.