工厂方法模式(Factory Method)-创建型模式第一篇

解决的问题:

  1. 如何创建一个对象,以便子类可以重新定义要实例化的类
  2. 一个类如何将实例化延迟到子类

怎么去解决:

  1. 为创建对象定义单独的操作方法(工厂方法)
  2. 通过调用工厂方法创建对象

定义:

定义用于创建对象的接口,但让子类决定要实例化哪个类。工厂方法允许类延迟实例化它使用的子类。

创建对象通常需要复杂的过程,对象的创建可能导致代码的大量重复,可能需要构成对象无法访问的信息,可能无法提供充分的抽象级别。工厂方法模式通过定义单独的方法去创建对象来处理这些问题,然后子类可以重写以满足未来创建产品的派生类型。

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;
                }
            }
        }
    }

}

输出:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.