工厂方法模式

Posted saints

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

定义

定义了一个创建对象的接口,由子类决定实例化哪一个对象,工厂方法让类把实例化推迟到子类。

UML类图

技术图片

实现

案例:提供一个画图程序,支持柱状图和饼图,根据不同的用户类型(免费/付费),显示不同的图形版本,付费用户会得到更丰富的图形显示。
为了能够简单描述工厂方法模式,应用以控制台应用的形式编写

定义接口

Creater

    public interface IChartCreater
    {
        IChart GetChart(string type,string title);
    }

Product

    public interface IChart
    {
        string Title { get; set; }
        void GenerateChart();
    }

定义ConcreteProduct

免费类型

    public class BarChart : IChart
    {
        public string Title { get; set ; }

        public BarChart(string title)
        {
            Title = title;
        }

        public void GenerateChart()
        {
            Console.WriteLine($"Drawing a Bar chart with title {Title}");
        }
    }
    public class PieChart : IChart
    {
        public string Title { get; set; }

        public PieChart(string title)
        {
            Title = title;
        }

        public void GenerateChart()
        {
            Console.WriteLine($"Drawing a Pie chart with title {Title}");
        }
    }

付费类型

    public class RichBarChart : IChart
    {
        public string Title { get; set; }

        public RichBarChart(string title)
        {
            Title = title;
        }

        public void GenerateChart()
        {
            Console.WriteLine($"Drawing a Rich Bar chart with title {Title}");
        }
    }
    public class RichPieChart : IChart
    {
        public string Title { get; set; }

        public RichPieChart(string title)
        {
            Title = title;
        }

        public void GenerateChart()
        {
            Console.WriteLine($"Drawing a Rich Pie chart with title {Title}");
        }
    } 

定义ConcreteCreater

免费类型

    public class ChartCreaterFree : IChartCreater
    {
        public IChart GetChart(string type, string title)
        {
            if (type=="bar")
            {
                return new BarChart(title);
            }
            if (type=="pie")
            {
                return new PieChart(title);
            }
            return null;
        }
    }

付费类型

    public class ChartCreaterPaid : IChartCreater
    {
        public IChart GetChart(string type, string title)
        {
            if (type == "bar")
            {
                return new RichBarChart(title);
            }
            if (type == "pie")
            {
                return new RichPieChart(title);
            }
            return null;
        }
    }

测试

    class Program
    {
        static void Main(string[] args)
        {
            IChartCreater createrFree = new ChartCreaterFree();
            IChartCreater createrPaid = new ChartCreaterPaid();

            IChart bar = createrFree.GetChart("bar", "a free bar chart");
            IChart pie = createrPaid.GetChart("pie", "a paid pie chart");

            bar.GenerateChart();
            pie.GenerateChart();
            Console.ReadLine();
        }
    }

以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

设计模式-工厂方法模式(Go实现)

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式---工厂模式