设计模式之简单工厂模式

简单工厂模式解释: 

       简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

       简单工厂模式中包含的角色及其相应的职责如下:

       工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。

       抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。

       具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

1、编制类图

2、 新建Chart类:抽象图表接口,充当抽象产品类。 

3、新建HistogramChart类,表示柱状图类,充当具体产品类。

using System;
namespace SimpleFactorySample
{
    class HistogramChart : Chart 
    {
    public HistogramChart()
        {
    Console.WriteLine("创建柱状图"!);
    }
    public void Display()
        {
            Console.WriteLine("显示柱状图!");
    }
    }
}

4、 新建PieChart类,表示饼状图类,充当具体产品类。

using System;
namespace SimpleFactorySample
{
    class PieChart : Chart 
    {
    public PieChart()
    {
    Console.WriteLine("创建饼状图!");
    }
    public void Display()
    {
    Console.WriteLine("显示饼状图!");
    }
    }
}

5、 新建LineChart,表示折线图类,充当具体产品类。

using System;
namespace SimpleFactorySample
{
    class LineChart : Chart
    {
        public LineChart()
        {
    Console.WriteLine("创建折线图!");
    }
        public void Display()
        {
    Console.WriteLine("显示折线图!");  
    }
}

6、 创建图表工厂类ChartFactory,用于充当工厂类

using System; 
namespace SimpleFactorySample
{
    class ChartFactory
    {
        //静态工厂方法
        public static Chart GetChart(string type)
        {
    Chart chart = null;
   if (type.Equals("histogram"))
    {
    chart = new HistogramChart();
    Console.WriteLine("初始化设置柱状图!");
    }
    else if (type.Equals("pie"))
     {
    chart = new PieChart();
    Console.WriteLine("初始化设置饼状图!");
    }
    else if (type.Equals("line"))
     {
    chart = new LineChart();
    Console.WriteLine("初始化设置折线图!");
    }
    return chart;
    }
    }
}

7、更新客户端测试类的代码

using System;
using System.Configuration;
namespace SimpleFactorySample
{
    class Program
    {
        static void Main(string[] args)
        {
            Chart chart;
            //读取配置文件
            string chartStr = ConfigurationManager.AppSettings["chartType"];
            chart = ChartFactory.GetChart(chartStr); //通过静态工厂方法创建产品
            chart.Display();
            Console.Read();
        }
    }
}

新建并实现如下类:

using System;
namespace SimpleFactorySample
{
    abstract class Product
    {
        //所有产品类的公共业务方法
        public void MethodSame()
        {
            //公共方法的实现
        }
        //声明抽象业务方法
        public abstract void MethodDiff();
    }
    class ConcreteProductA : Product
    {
        //实现业务方法
        public override void MethodDiff()
        {
            //业务方法的实现
        }
    }
    class ConcreteProductB : Product
    {
        //实现业务方法
        public override void MethodDiff()
        {
            //业务方法的实现
        }
    }
    class Factory
    {
        //静态工厂方法
        public static Product GetProduct(string arg)
        {
            Product product = null;
            if (arg.Equals("A"))
            {
                product = new ConcreteProductA();
                //初始化设置product
            }
            else if (arg.Equals("B"))
            {
                product = new ConcreteProductB();
                //初始化设置product
            }
            return product;
        }
    }
}
namespace SimpleFactorySample
{
    /*
    abstract class Product
    {
        public abstract void Process();
    }
    class ConcreteProductA : Product
    {
        public override void Process()
        {
            //......
        }
    }
    class ConcreteProductB : Product
    {
        public override void Process()
        {
            //......
        }
    }
    class Factory
    {
        public static Product CreateProduct(char type)
        {
            switch(type)
            {
                case 'A':
                    return new ConcreteProductA(); break;
                case 'B':
                    return new ConcreteProductB(); break;
                //......
            }
        }
    }
    */
}

8、 编译及运行程序,输出如下结果:

posted @ 2017-06-19 22:25  Jonny-Xhl  阅读(86)  评论(0编辑  收藏  举报