C#面向对象设计之——简单工厂模式(二)

一、前言

简单工厂是一个负责生产对象的中间类,例如有加减乘除四个运算方法,它们继承父类,并重写父类的方法,简单工厂根据不同的运算符创建不同的实例对象赋值给父类,实现了面向对象的另一个原则——降低对象之间的耦合度。简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。

简单工厂模式的缺点:

  • 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

了解了简单工厂模式之后的优缺点之后,我们之后就可以知道简单工厂的应用场景了:

  • 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式
  • 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式

二、简单工厂结构图

三、实例代码

1.1运算类

    /// <summary>
    /// 运算类
    /// </summary>
    public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;

        /// <summary>
        /// 数字A
        /// </summary>
        public double NumberA
        {
            get
            {
                return _numberA;
            }
            set
            {
                _numberA = value;
            }
        }

        /// <summary>
        /// 数字B
        /// </summary>
        public double NumberB
        {
            get
            {
                return _numberB;
            }
            set
            {
                _numberB = value;
            }
        }

        /// <summary>
        /// 得到运算结果
        /// </summary>
        /// <returns></returns>
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }

        /// <summary>
        /// 检查输入的字符串是否准确
        /// </summary>
        /// <param name="currentNumber"></param>
        /// <param name="inputString"></param>
        /// <returns></returns>
        public static string checkNumberInput(string currentNumber, string inputString)
        {
            string result = "";
            if (inputString == ".")
            {
                if (currentNumber.IndexOf(".") < 0)
                {
                    if (currentNumber.Length == 0)
                        result = "0" + inputString;
                    else
                        result = currentNumber + inputString;
                }
            }
            else if (currentNumber == "0")
            {
                result = inputString;
            }
            else
            {
                result = currentNumber + inputString;
            }

            return result;
        }

    }

    /// <summary>
    /// 加法类
    /// </summary>
    class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    /// <summary>
    /// 减法类
    /// </summary>
    class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

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

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

    /// <summary>
    /// 平方类
    /// </summary>
    class OperationSqr : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberB * NumberB;
            return result;
        }
    }

    /// <summary>
    /// 平方根类
    /// </summary>
    class OperationSqrt : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB < 0)
                throw new Exception("负数不能开平方根。");
            result = Math.Sqrt(NumberB);
            return result;
        }
    }

    /// <summary>
    /// 相反数类
    /// </summary>
    class OperationReverse : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = -NumberB;
            return result;
        }
    }

1.2简单工厂

    /// <summary>
    /// 运算类工厂
    /// </summary>
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;
                }
            case "sqr":
                {
                    oper = new OperationSqr();
                    break;
                }
            case "sqrt":
                {
                    oper = new OperationSqrt();
                    break;
                }
            case "+/-":
                {
                    oper = new OperationReverse();
                    break;
                }
        }

        return oper;
    }
}

1.3客户端程序

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();
                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();
                Console.Write("请输入数字B:");
                string strNumberB = Console.ReadLine();
                string strResult = "";

                Operation oper;
                oper = OperationFactory.createOperate(strOperate);
                oper.NumberA = Convert.ToDouble(strNumberA);
                oper.NumberB = Convert.ToDouble(strNumberB);
                strResult = oper.GetResult().ToString();

                Console.WriteLine("结果是:" + strResult);

                Console.ReadLine();

            }
            catch (Exception ex)
            {
                Console.WriteLine("您的输入有错:" + ex.Message);
            }
        }
    }
时间: 2024-11-10 12:11:04

C#面向对象设计之——简单工厂模式(二)的相关文章

C#面向对象设计之——抽象工厂模式(四)

一.前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题. 抽象工厂模式提供创建一系列相关或者相互依赖对象的接口. 二.结构图 三.实例代码

面向对象编程思想-简单工厂模式

一.引言 简单工厂.工厂方法.抽象工厂模式都属于设计模式中的创建型设计模式,它们帮助我们把对象的实例化部分抽取出来,进而优化系统架构,提高系统的扩展性.本文介绍一个比较容易理解的模式-简单工厂模式. 二.简单工厂模式 定义:"工厂"?!看到这个词语,在现实生活中大家会想到是生产产品的,同样,在简单工厂模式里大家可以理解为工厂其实就是创建对象的一个类.平时我们编程的时候,当使用"new"创建对象时,此类就增加了对该对象的依赖,它们之间的耦合度就增加了,这样当业务需求变

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需要对实例化进行限制. 单例模式实现要点: ① 构造函数私有化,不允许使用new关键字创建对象  ② 对外提供获取对象的方法.在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回  ③ 实例对象的属性以及获取对象的方法必须是静态的  ④ 之后,创建对象只能使用我们提供的静态方法. 

pyhon面向对象设计之抽象工厂模式

简介 抽象工厂设计模式属于创建型设计模式的一种,创建型设计模式更关注对象是如何被创建出来的.通常我们会调用对象的构造函数来创建对象实例,比如通过向类名称传递相关参数来创建.但是,有时候我们会需要更加灵活的对象创建方式,这时创建型的设计模式就会大有用处了.今天我们主要关注创建型的设计模式中的抽象工厂设计模式.抽象工厂设计模式主要用于对于某一个系统而言,根据配置文件的不同或者系统平台(windows/mac/linux)的不同有多种不同的实现方式的时候.比如:在一个GUI系统里,我们可能有一个抽象的

Java反射+简单工厂模式总结

除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 一般情况下,最直接的写法为: public class Apple { public void get() { System.out.println("得到苹果"); } }   public class Banana { public void get() { System.out.p

面向对象之简单工厂模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Interface { class InterfaceTest { static void Main(string[] args) { #region 测试Cat,Monkey,Bear类 introduction test; for (int i = 1; i<=3; i++) { switch (i)

深入理解设计模式(二):简单工厂模式

本文首先概述了简单工厂模式本质及结构,揭示了简单工厂模式的应用场景和优缺点,紧接着列举出了和工厂方法模式.策略模式的异同及应用场景,最后我们给出了简单工厂模式的实现方式及注意事项. 一.什么是简单工厂模式 简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例. 其实就是将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计

[DesignPatterns]二、简单工厂模式(SimpleFactoryPattern)

参考书籍:大话设计模式 督促自己可以一步一步把书本好好看完学完,为未来做努力 简单工厂模式 这是我看完后的想法,简单工厂模式就是透过一个单独类去做判断来new出指定的类,前提时,这些需要new出的都是继承于一个Class底下 书本上是以计算机加减乘除来做教学,而我自己也尝试看书练习了出来 过去 在过去可能用一个Switch去搞定判断各个逻辑所要计算的结果 缺点:这样子使用的话,是有用到了封装,但一旦运算逻辑多的时候,就要担心是否会改错改到其他逻辑 现在 一.先设计出每个运算逻辑的共通属性以及增加

模式设计学习 之 简单工厂模式

有幸看到园友推荐的 <大话设计模式>十分感谢,准备练习一下,以免忘记. 设计模式 需要灵活运用,不能为了 设计而设计,这样就得不偿失了. 简单工厂模式 又叫做 静态方法 模式 ,不在 23 种 设计模式之内 .是项目中最简单实用的 模式.它避免了大量的 代码 写在 一起 造成的 项目混乱,实现了简单的分层. 可以使用户只关心 使用 ,传入参数 调用方法. 缺点 是 大量的 业务 逻辑 处理 写在同一个 工厂 内, 当 需求发生 变动时,需要去修改工厂内的方法,这样违反了开放封闭原则. 写个例子