设计模式——简单工厂模式

文章目录

面向对象------如:活字印刷术 封装、继承、多态

通过面向对象的三大特性:封装、继承、多态 降低程序耦合度。使得程序易维护、易扩展、易复用

松耦合------业务逻辑与界面逻辑分离------简单工厂模式

例如构建一个计算器功能:

1.根据计算方式,只编译该类型与方法,而不是编译所有,易于维护。例如:使用加法运算只编译加法运算而不是所有运算。

2.添加其他运算方式。例如添加次方运算,不用给工程师整个代码,发生其他计算方式代码误操作、更改、泄密等其他情况。

以下分别举例紧耦合案列、松耦合案例:

紧耦合举例

所有方法汇总在一起,导致计算时需要全部加载

csharp 复制代码
       public void TryCal()
       {
            try
            {
                //输入数字A:
                string strNumberA = numberA.Text;
                //请选择运算符号(+、-、*、/)
                string strOperate = numberO.Text;
                //请输入数字B:
                string strNumberB = numberB.Text;
                numberR.Text = operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate).ToString();
            }
            catch (Exception er)
            {
                LBError.Content = er.Message.ToString();
            }

        }
        public class operation
        {
            public static double GetResult(double A, double B, string operatesign)
            {
                double result = 0d;
                switch (operatesign)
                {
                    case "+":
                        result = A + B;
                        break;
                    case "-":
                        result = A - B;
                        break;
                    case "*":
                        result = A * B;
                        break;
                    case "/":
                        result = A / B;
                        break;
                    default:
                        break;
                }
                return result;
            }
        }

        private void numberR_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key==Key.Enter)
            {
                TryCal();
            }
        }

松耦合举例------简单工厂模式

利用简单工厂模式,根据条件实例化对象,避免增加不必要的实例化对象。

csharp 复制代码
       public void TryCall_Factory()
        {
            try
            {
               operationL opel = OperationFactory.createOperate(numberO.Text);
                opel.NumberA = Convert.ToDouble(numberA.Text);
                opel.NumberB = Convert.ToDouble(numberB.Text);
                numberR.Text = opel.Getresult().ToString();
            }
            catch (Exception er)
            {
                LBError.Content = er.Message.ToString();

            }
        }
        public class OperationFactory
        {
            public static operationL createOperate(string operatestr)
            {
                operationL operation = null;
                switch (operatestr)
                {
                    case "+":
                        operation = new OperationAdd();
                        break;
                    case "-":
                        operation = new OperationSub();
                        break;
                    case "*":
                        operation = new OperationMul();
                        break;
                    case "/":
                        operation = new OperationDiv();
                        break;
                }
                return operation;
            }
        }
        public class operationL
        {
            private Double _numberA;

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

            private Double _numberB;

            public Double NumberB
            {
                get { return _numberB; }
                set { _numberB = value; }
            }
            public virtual Double Getresult()
            {
                double result = 0d;
                return result;
            }
        }
        public class OperationAdd:operationL
        {
            public override double Getresult()
            {
                double result = 0d;
                result = NumberA + NumberB;
                return result;
            }
        }
        public class OperationSub : operationL
        {
            public override double Getresult()
            {
                double result = 0d;
                result = NumberA - NumberB;
                return result;
            }
        }
        public class OperationMul : operationL
        {
            public override double Getresult()
            {
                double result = 0d;
                result = NumberA* NumberB;
                return result;
            }
        }
        public class OperationDiv : operationL
        {
            public override double Getresult()
            {
                double result = 0d;
                if (NumberB == 0)
                    throw new Exception("除数不能为0");
                result = NumberA /NumberB;
                return result;
            }
        }
相关推荐
mldong6 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
samble10 小时前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
UIU11411 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
风云12 小时前
MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架
开源·c#·.net·日志·高性能·minilog
慧都小妮子13 小时前
C# 工程图纸数字化入库实战:Aspose.Imaging 自动抠图、多页 TIFF 合卷与坏页容错
图像处理·c#·.net·aspose·tiff·归档·文档管理
新知图书13 小时前
第8章 多智能体协同
人工智能·设计模式·智能体
京师20万禁军教头16 小时前
39面向对象(高级)-设计模式
java·开发语言·设计模式
samble17 小时前
从零搭建工业控制系统(二十一):状态管理系统——中心状态对象设计
c#·wpf·mvvm·状态管理·工业控制
俊昭喜喜里19 小时前
C#中的func<>
java·前端·c#
highreport19 小时前
net报表工具对比:HighReport 与 FastReport
java·c#