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、 编译及运行程序,输出如下结果:

  • 相关阅读:
    MySQL之ERROR 1558 (HY000): Column count of mysql.user is wrong.解决方案
    手动发布本地jar包到Nexus私服
    Git的常用命令
    手游录屏直播技术详解 | 直播 SDK 性能优化实践
    【容器云】十分钟快速构建 Influxdb+cadvisor+grafana 监控
    【容器云】传统金融企业的 Docker 实践
    直播推流端弱网优化策略 | 直播 SDK 性能优化实践
    云存储之覆盖上传——七牛云
    「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
    「视频直播技术详解」系列之六:现代播放器原理
  • 原文地址:https://www.cnblogs.com/cqxhl/p/12993321.html
Copyright © 2011-2022 走看看