解决的问题:
- 如何创建一个对象,以便子类可以重新定义要实例化的类
- 一个类如何将实例化延迟到子类
怎么去解决:
- 为创建对象定义单独的操作方法(工厂方法)
- 通过调用工厂方法创建对象
定义:
定义用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类延迟实例化它使用的子类。
创建对象通常需要复杂的过程,对象的创建可能导致代码的大量重复,可能需要构成对象无法访问的信息,可能无法提供充分的抽象级别。工厂方法模式通过定义单独的方法去创建对象来处理这些问题,然后子类可以重写以满足未来创建产品的派生类型。
UML:
实例:
namespace FactoryMethodPattern { public interface IDisplayer { } public class LCDDisplayer : IDisplayer { } public class LEDDisplayer : IDisplayer { } public abstract class DisplayerCreatorBase { public abstract IDisplayer CreateDisplayer(); } public class LCDDisplayerCreator : DisplayerCreatorBase { public override IDisplayer CreateDisplayer() { return new LCDDisplayer(); } } public class LEDDisplayerCreator : DisplayerCreatorBase { public override IDisplayer CreateDisplayer() { return new LEDDisplayer(); } } internal class Program { private static void Main(string[] args) { DoWork(); } private static void DoWork() { DisplayerCreatorBase displayerCreator; while (true) { Console.WriteLine("Please select the type of displayer you want."); Console.WriteLine($"A: LED{Environment.NewLine}B: LCD"); var inputKey = Console.ReadKey(); Console.WriteLine(); switch (inputKey.KeyChar.ToString().ToUpper()) { case "A": displayerCreator = new LEDDisplayerCreator(); Console.WriteLine(displayerCreator.CreateDisplayer()); break; case "B": displayerCreator = new LCDDisplayerCreator(); Console.WriteLine(displayerCreator.CreateDisplayer()); break; case "X": return; default: Console.WriteLine("You enter a wrong character and enter 'x' to exit the program"); break; } } } } }