The Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
using System; // Product interface public interface IProduct { string Operation(); } // Concrete Products public class ConcreteProduct1 : IProduct { public string Operation() { return "{Result of ConcreteProduct1}"; } } public class ConcreteProduct2 : IProduct { public string Operation() { return "{Result of ConcreteProduct2}"; } } // Creator abstract class public abstract class Creator { // The factory method public abstract IProduct FactoryMethod(); public string SomeOperation() { // Call the factory method to create a Product object var product = FactoryMethod(); // Now, use the product return $"Creator: The same creator's code has just worked with {product.Operation()}"; } } // Concrete Creators public class ConcreteCreator1 : Creator { public override IProduct FactoryMethod() { return new ConcreteProduct1(); } } public class ConcreteCreator2 : Creator { public override IProduct FactoryMethod() { return new ConcreteProduct2(); } } // Client code class Program { static void Main(string[] args) { Console.WriteLine("App: Launched with ConcreteCreator1."); ClientCode(new ConcreteCreator1()); Console.WriteLine(""); Console.WriteLine("App: Launched with ConcreteCreator2."); ClientCode(new ConcreteCreator2()); } public static void ClientCode(Creator creator) { Console.WriteLine("Client: I'm not aware of the creator's class," + "but it still works.\n" + creator.SomeOperation()); } }
App: Launched with ConcreteCreator1. Client: I'm not aware of the creator's class, but it still works. Creator: The same creator's code has just worked with {Result of ConcreteProduct1} App: Launched with ConcreteCreator2. Client: I'm not aware of the creator's class, but it still works. Creator: The same creator's code has just worked with {Result of ConcreteProduct2}
// Document creator example public interface IDocument { void Open(); void Save(); } public class WordDocument : IDocument { public void Open() => Console.WriteLine("Opening Word document"); public void Save() => Console.WriteLine("Saving Word document"); } public class PdfDocument : IDocument { public void Open() => Console.WriteLine("Opening PDF document"); public void Save() => Console.WriteLine("Saving PDF document"); } public abstract class DocumentCreator { public abstract IDocument CreateDocument(); public void NewDocument() { var doc = CreateDocument(); doc.Save(); } } public class WordDocumentCreator : DocumentCreator { public override IDocument CreateDocument() => new WordDocument(); } public class PdfDocumentCreator : DocumentCreator { public override IDocument CreateDocument() => new PdfDocument(); }
This pattern is widely used in .NET frameworks, such as in ASP.NET Core's dependency injection system where services are created using factory methods.
Comments - Beta - WIP