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

前言

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

简单工厂模式(http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html)的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化那一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移动到了客户端代码来进行。你想要加功能,本来是改工厂类的(简单工厂模式),而现在是修改客户端。

工厂方法UML类图

如果想加一个功能,比如M的N次方,只需要增加此功能的运算类和相应的工厂类就可以了。

代码实现

 1.第一步写好运算类:

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

        public double NumberB { get; set; }

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

2.那么接下来就需要实现加减乘除运算类

    /// <summary>
    /// 加法运算类
    /// </summary>
    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;
        }
    }

第三步写好抽象工厂

    ///抽象工厂 工厂接口
    public interface IFactory
    {
        Operation CreateOperation();
    }

工厂接口返回的就是运算类

第四步实现加减乘除抽象工厂

    /// <summary>
    /// 加法工厂类
    /// </summary>
    public class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

    /// <summary>
    /// 减法工厂类
    /// </summary>
    public class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }

    /// <summary>
    /// 乘法工厂类
    /// </summary>
    public class MulFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }

    /// <summary>
    /// 除法工厂类
    /// </summary>
    public class DivFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

第五步进行调用一个加法的示例

    class Program
    {
        static void Main(string[] args)
        {
            ////调用加法的示例
            IFactory OperationFactory = new AddFactory();
            Operation Oper = OperationFactory.CreateOperation();
            Console.WriteLine("输入第一个数字:A");
            Oper.NumberA = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("输入第二个数字:B");
            Oper.NumberB = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine(Oper.GetResult());
            Console.ReadLine();
        }
    }

运行后结果为

总结

 工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,有保持了封装对象创建过程的优点。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。当然还有更好的方案……

如果您对上节的简单工厂模式还不太了解可以看一下http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS技术杂谈

iOS @property探究(一): 基础详解你要知道的@property都在这里

你要知道的@property都在这里 本文大纲 Apple Adopting Modern Objective-C翻译 @property基本用法 @prope...

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

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

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

1042
来自专栏谦谦君子修罗刀

swift4.0语法杂记(精简版)

一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年...

4389
来自专栏恰同学骚年

C#基础与常用数据结构学习笔记

  接口相当于没有方法实现的抽象类,接口方法不要加各种访问级别:例如public,private等。

993
来自专栏逸鹏说道

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

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

853
来自专栏Java3y

LinkedHashMap就这么简单【源码剖析】

1604
来自专栏cmazxiaoma的架构师之路

你应该会的一道多线程笔试题

2633
来自专栏http://www.cnblogs.com

time&datetime模块详解

 一.time模块 1.时间格式转换图: ? 2.time模块中时间表现的格式主要有三种:   a、timestamp时间戳,时间戳表示的是从1970年1月1日...

4159
来自专栏技术博客

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

  简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来...

711
来自专栏韩伟的专栏

框架设计原则和规范(四)

祝大家平安夜平安,圣诞节快乐! 此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送最后两章。 1. 什么是好的...

4224

扫码关注云+社区

领取腾讯云代金券