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

  1. 《设计模式》系列序——写给未来的自己
  2. 工厂方法模式(Factory Method)-创建型模式第一篇
  3. 抽象工厂模式(Abstract Factory Pattern)-创建型模式第二篇
  4. 单例模式(Singleton Pattern)-创建型模式第三篇
  5. 建造者模式(Builder Pattern)-创建型模式第四篇
  6. 原型模式(Prototype Pattern)-创建型模式第五篇
  7. 装饰者模式 (Decorator Pattern)-结构型模式第一篇
  8. 组合模式 (Composite Pattern)-结构型模式第二篇
  9. 适配器模式 (Adapter Pattern)-结构型模式第三篇
  10. 代理模式 (Proxy Pattern)-结构型模式第四篇
  11. 桥接模式 (Bridge Pattern)-结构型模式第五篇

解决的问题:

  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 *