设计模式之二(简单工厂模式)

前言

  简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同。

下面我只是来演示一下简单工厂模式,代码不会太复杂。所以大家可以使用Submile Text工具。

使用方法博客文章链接http://www.cnblogs.com/aehyok/archive/2013/05/05/3059087.html可直接编译运行查看效果哦。

简单工厂模式

  假定A是一个基类,AB和AC都是派生于A的派生类,XFactory类中根据提供给它的参数来决定返回AB或者AC 类的哪一个,返回的是哪个类的实例对于编程者来说并不是那么重要,因为这些类有着相同的方法,编程者需要做的就是通过基类引用直接调用方法,不用去关心到底返回的是哪个派生类,因为这些类有相同的方法,只是实现不同而已。如何决定返回哪一个派生类,取决于工厂的设计,该方法可以是非常复杂的函数,也可以是简单的函数。

接下来我们就通过简单加减乘除的计算器来了解和实现简单工厂模式。

第一步:根据上面的小例子首先我来创建一个基类A

    ///Operation运算类
    public class Operation
    {
        public double NumberA { get; set; }

        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

第二步:然后创建派生类AB AC即加、减、乘、除四个派生类。

    ///加减乘除类
    ///加法类
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA + this.NumberB;
            return result;
        }
    }
    ///减法类
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA - this.NumberB;
            return result;
        }
    }

    /// <summary>
    /// 乘法类
    /// </summary>
    public class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = this.NumberA * this.NumberB;
            return result;
        }
    }

    /// <summary>
    /// 除法类
    /// </summary>
    public class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (this.NumberB == 0)
            {
                throw new Exception("除数不能为0。");
            }
            result = this.NumberA / this.NumberB;
            return result;
        }
    }

第三步:创建XFactory来返回AB、AC。

    ///简单工厂类
    public class OperationFactory
    {
        public static Operation CreateOperate(string operate)
        {
            Operation Oper = null;
            switch (operate)
            { 
                case"+":
                    Oper = new OperationAdd();
                    break;
                case"-":
                    Oper = new OperationSub();
                    break;
                case"*":
                    Oper = new OperationMul();
                    break;
                case"/":
                    Oper = new OperationDiv();
                    break;
            }
            return Oper;
        }
    }

第四步:先来一个加法的调用:

        static void Main(string[] args)
        {
            Operation Oper = OperationFactory.CreateOperate("+");
            Console.WriteLine("请输入第一个数字A:");
            Oper.NumberA =Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入第二个数字B:");
            Oper.NumberB = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("结果为:{0}",Oper.GetResult());
            Console.ReadLine();
        }

运行结果为

总结

 在此简单工厂模式,其实使用了面向对象中的几点编程思想。

创建Operation其实是对业务的封装

然后实现加减乘除类都继承Operation并重写各自应有的业务逻辑。

我们如果再加一个算法开根(sqrt)算法,那么只需要新增加一个继承Operation的类,然后在简单工厂类中添加一个分支即可。这里我们发现这是易扩展(松耦合)、易维护

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏blackheart的专栏

[C#1] 11-接口

接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

2039
来自专栏依乐祝

[译]聊聊C#中的泛型的使用(新手勿入)

今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发现了一些问题,因...

1184
来自专栏Java与Android技术栈

Java8 Stream的总结

Stream是Java 8新增的接口,Stream可以认为是一个高级版本的 Iterator。它代表着数据流,流中的数据元素的数量可以是有限的,也可以是无限的。

1002
来自专栏vue

.net 数据类型转换int.Parse()与int.TryParse

如果字符串为空,则抛出ArgumentNullException异常; 如果字符串内容不是数字,则抛出FormatException异常; 如果字符串内容...

1042
来自专栏calmound

sprintf的用法

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者...

3446
来自专栏风口上的猪的文章

.NET面试题系列[6] - 反射

在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等)。如果答得...

1032
来自专栏技术博客

C#基础知识系列八(const和readonly关键字)

  不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一...

1212
来自专栏分布式系统和大数据处理

.Net中的反射(查看类型信息) - Part.2

简单来说,反射提供这样几个能力:1、查看和遍历类型(及其成员)的基本信息和程序集元数据(metadata);2、迟绑定(Late-Binding)方法和属性。3...

1183
来自专栏技术博客

设计模式之三(工厂方法模式)

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。

1612
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(Function专栏)

汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai

1765

扫码关注云+社区

领取腾讯云代金券