Factory deseninin temel amacı nesne oluşturma karmaşıklığını kullanıcıdan gizlemektir. Ayrıca kullanıcı, oluşturulacak nesnenin somut türünü belirlemek zorunda değildir. Bunun yerine somut nesnenin implemente edildiği soyut tür olan interface veya abstract class tipini bilmesi yeterlidir. Yani sorumluluk somut nesnelerden soyut nesnelere aktarılmaktadır. Genel olarak Factory sınıflar “static” erişim belirleyicili bir metod barındırırlar. Bu metod, kullanıcıya interface veya abstract class tipinde bir nesne döndürür. Bu sayede kullanıcılar, alt sınıfların oluşturulması sorumluluğundan dolayı oluşabilecek hatalardan da uzak tutulmuş olur.
Örnek Uygulama
Bu örnek uygulamamızda Grafik türüne göre Grafiğin temsilini yapan Sembollerin oluşturulmasını Factory Method yöntemiyle üretmeyi amaçlamaktayız.
Yukarıdaki şekildeki tasarım deseninin uygulanışını şu şeklide yapabiliriz.
Gerçek bir uygulamadan alarak göstereceğim bu örnekte bir REST servisinden gelen Graphic nesnesinin türüne göre sembol nesnesinin belirlenmesi işlemini Factory Method inceleyeceğiz. Tabi bu örnekteki konumuz Factory uygulaması olduğundan Servis işlemlerini temsili olarak göreceğiz. Bizi ilgilendiren sadece nesne üretimi olduğundan nesne üretim aşamasını inceleyeceğiz.
public class Graphic { public Symbol Symbol { get ; set ; } } |
public abstract class Symbol { public abstract void draw(); } |
public class SimpleLineSymbol: Symbol { public override void draw() { // Draw line } } public class SimpleFillSymbol: Symbol { public override void draw() { // Draw polygon } } public class SimpleMarkerSymbol: Symbol { public override void draw() { // Draw point } } |
public class GraphicSymbolFactory { public static Symbol GetSymbol(Graphic graphic) { if (graphic is Point) return new SimpleMarkerSymbol(); if (graphic is Polygon) return new SimpleFillSymbol(); if (graphic is Polyline) return new SimpleLineSymbol(); throw new InvalidExpressionException( "Unknown graphic type" ); } } |
public class GraphicService { private readonly IGraphicRestService service; public GraphicService(IGraphicRestService service) { this .service = service; } public Graphic GetGraphicsFromRESTService( string serviceUrl) { Graphic graphic = service.GetGraphic(serviceUrl); graphic.Symbol = GraphicSymbolFactory.GetSymbol(graphic); return graphic; } } |