解决的问题:
- 如何创建一个对象,以便子类可以重新定义要实例化的类
- 一个类如何将实例化延迟到子类
怎么去解决:
- 为创建对象定义单独的操作方法(工厂方法)
- 通过调用工厂方法创建对象
定义:
定义用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类延迟实例化它使用的子类。
创建对象通常需要复杂的过程,对象的创建可能导致代码的大量重复,可能需要构成对象无法访问的信息,可能无法提供充分的抽象级别。工厂方法模式通过定义单独的方法去创建对象来处理这些问题,然后子类可以重写以满足未来创建产品的派生类型。
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;
}
}
}
}
}


