zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂模式

    简单工厂模式解释: 

           简单工厂模式(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、 编译及运行程序,输出如下结果:

  • 相关阅读:
    Java实现 LeetCode 30 串联所有单词的子串
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 27 移除元素
    字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  • 原文地址:https://www.cnblogs.com/cqxhl/p/12993321.html
Copyright © 2011-2022 走看看