26【软件基础】简单计算器的实现+工厂方法模式应用+封装、继承、多态的体现

简介: 工厂方法模式是一种常用的`创建型设计模式`,它提供了一种将对象的创建过程封装起来的方法。在工厂方法模式中,将对象的创建过程交给一个`工厂类`来完成,而不是在代码中直接调用构造函数来创建对象。这样可以使得代码更加灵活,`降低耦合度`,方便后期维护和扩展。

前言

工厂方法模式是一种常用的创建型设计模式,它提供了一种将对象的创建过程封装起来的方法。在工厂方法模式中,将对象的创建过程交给一个工厂类来完成,而不是在代码中直接调用构造函数来创建对象。这样可以使得代码更加灵活,降低耦合度,方便后期维护和扩展。

工厂方法模式的核心思想是定义一个工厂接口,该接口包含一个创建产品的方法。具体的产品创建由实现该接口的具体


一、运行效果

实现计算器的加减乘数计算。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_工厂方法模式
{
    class Program
    {
        //分析:将+、-、*、/四种运算分为四大类,每种类中的属性和方法类似,因此可使用操作抽象类
        //在创建类对象的时候使用工厂方法模式,即建一个工厂抽象类,不同的运算创建新的工厂类,不同的类分在不同的工厂中制造
        //这样子的好处是,创建不同类的工厂单独的方式修改,不会引起同类型其他工厂类的使用

        static void Main(string[] args)
        {
            Console.WriteLine("请输入运算符:\r\n");

            string operChar = Console.ReadLine();

            Operation oper = null; ;

            switch (operChar)
            {
                case "+":
                    {
                        FactoryOperationAdd facAdd = new FactoryOperationAdd();
                        oper = facAdd.creatOperation(operChar);
                        break;
                    }
                case "-":
                    {
                        FactoryOperationSub facSub = new FactoryOperationSub();
                        oper = facSub.creatOperation(operChar);
                        break;
                    }
                case "*":
                    {
                        FactoryOperationMul facMul = new FactoryOperationMul();
                        oper = facMul.creatOperation(operChar);
                        break;
                    }
                case "/":
                    {
                        FactoryOperationDiv facDiv = new FactoryOperationDiv();
                        oper = facDiv.creatOperation(operChar);
                        break;
                    }
            }

            Console.WriteLine("请输入第一个数:\r\n");
            oper.NumberA = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("请输入第二个数:\r\n");
            oper.NumberB = Convert.ToDouble(Console.ReadLine());

            double result = oper.GetResult();

            Console.WriteLine("计算结果是:" + oper.NumberA + operChar + oper.NumberB + "=" + result.ToString());
            Console.ReadKey();
        }

        class Operation
        {
            private double _numberA = 0;
            private double _numberB = 0;

            public double NumberA
            {
                get { return _numberA; }
                set { _numberA = value; }
            }

            public double NumberB
            {
                get { return _numberB; }
                set { _numberB = value; }
            }

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

        class OperationAdd : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA + NumberB;
                return result;
            }
        }

        class OperationSub : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA - NumberB;
                return result;
            }
        }

        class OperationMul : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }

        class OperationDiv : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA / NumberB;
                return result;
            }
        }

        /// <summary>
        /// 工厂抽象基类
        /// </summary>
        abstract class Factory
        {
            public abstract Operation creatOperation(string oper);
        }

        class FactoryAdd : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationAdd operAdd = new OperationAdd();
                return operAdd;
            }
        }

        class FactorySub : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationSub operSub = new OperationSub();
                return operSub;
            }
        }

        class FactoryMul : Factory
        {
            public override Operation creatOperation(string oper)
            {
                OperationDiv operDiv = new OperationDiv();
                return operDiv;
            }
        }

        class FactoryOperationAdd:Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "+":
                        {
                            operation = new OperationAdd();
                            break;
                        }
                }
                return operation;
            } 
        }

        class FactoryOperationSub : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "-":
                        {
                            operation = new OperationSub();
                            break;
                        }
                }
                return operation;
            }
        }

        class FactoryOperationMul : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "*":
                        {
                            operation = new OperationMul();
                            break;
                        }
                }
                return operation;
            }
        }

        class FactoryOperationDiv : Factory
        {
            public override Operation creatOperation(string oper)
            {
                Operation operation = null;
                switch (oper)
                {
                    case "/":
                        {
                            operation = new OperationDiv();
                            break;
                        }
                }
                return operation;
            }
        }
    }
}

三、简单工厂模式代码对比

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            OperationFactory operF;
            Operation oper;

            Console.WriteLine("请输入运算符:\r\n");
            string operChar=Console.ReadLine();

            operF = new OperationFactory();
            oper = operF.creatOperation(operChar);

            Console.WriteLine("请输入第一个数:\r\n");
            oper.NumberA = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("请输入第二个数:\r\n");
            oper.NumberB = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("运算结果为:\r\n");

            double result = oper.GetResult();
            Console.WriteLine(oper.NumberA.ToString() + operChar + oper.NumberB + "=" + result.ToString());

            Console.ReadKey();
        }
    }

    class Operation     //运算基类
    { 
        //定义两个数的属性
        private double _numberA = 0;
        private double _numberB = 0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }

        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double GetResult()   //定义虚方法
        {
            double result = 0;
            return result;
        }
    }

    class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

    class OperationMul : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

    class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA / NumberB;
            return result;
        }
    }

    /// <summary>
    /// 简单工厂创建对象,但一旦一个类的操作方式改变,整个工厂类都要改变,违反高内聚原则
    /// </summary>
    class OperationFactory      //运算对象生产工厂
    {
        public Operation creatOperation(string operation)
        {
            Operation oper = null;
            switch (operation)
            {
                case "+":
                    {
                        oper = new OperationAdd();
                        break;
                    }
                case "-":
                    {
                        oper = new OperationSub();
                        break;
                    }
                case "*":
                    {
                        oper = new OperationMul();
                        break;
                    }
                case "/":
                    {
                        oper = new OperationDiv();
                        break;
                    }   
            }
            return oper;
        }
    }
}

总结

工厂模式相对于简单工厂模式来说,针对每个产品类都有对应的产品工厂,这样每一类产品变动导致的工厂变动,只在对应的工厂中变动就可以。降低了耦合性,提高了内聚性。

目录
相关文章
|
4天前
|
存储 安全 编译器
封装、继承与多态究极详解
本文详细介绍了面向对象编程中的三大核心特性:封装、继承和多态。封装通过隐藏数据和提供接口,确保对象的安全性和一致性;继承通过类之间的“is-a”关系实现代码复用和扩展;多态则允许不同类的对象通过相同的接口执行不同的操作,增强程序的灵活性和可扩展性。文章还探讨了这些特性的底层实现机制,如虚函数表和内存布局,并提供了具体的代码示例。
16 0
|
3月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
3月前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
7月前
|
Java 程序员 编译器
Java面向对象之——继承
Java面向对象之——继承
|
设计模式 自然语言处理 C#
C#OOP之八 继承 接口和抽象类
C#OOP之八 继承 接口和抽象类
57 0
|
7月前
|
Java
Java面向对象程序设计5接口与抽象类
Java面向对象程序设计5接口与抽象类
70 0
|
Java
Java面向对象之继承
Java面向对象之继承
66 0
|
设计模式 Java
装饰与适配:解析Java设计模式中的装饰器模式和适配器模式
在软件开发领域,设计模式是一组经过实践验证的最佳实践方法,用于解决常见问题。装饰器模式和适配器模式分别是结构型设计模式中的两个重要成员,它们在不同的场景中发挥着关键作用。本文将深入了解装饰器模式和适配器模式的内涵,以及它们在Java中的实际应用。
131 0
|
Java
Java面向对象继承
继承的概念 继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也可以添加自己的属性和方法,从而实现代码的复用和扩展。继承是面向对象编程的三大特征之一,其他两个分别是封装和多态。 继承的作用 1.提高代码的复用性:通过继承,子类可以直接使用父类的属性和方法,不需要重复定义。 2.便于代码的扩展:通过在子类中添加新的属性和方法,实现了代码的扩展。 3.提高代码的可维护性:将公共的属性和方法放在父类中,可以减少重复的代码,从而方便代码维护和升级。
75 0
|
设计模式 程序员 编译器
【大话设计模式】封装 继承 多态
【大话设计模式】封装 继承 多态