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

文章目录

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

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

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

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

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;
            }
        }
相关推荐
CSharp精选营2 小时前
值类型与引用类型:别再只背“栈和堆”了,看这 4 个实际影响
c#·.net·值类型·引用类型·栈和堆·编程指南
qq_454245035 小时前
GraphFoundation动态更新图
架构·c#·图论
Yu_Lijing5 小时前
基于C++的《Head First设计模式》笔记——备忘录模式
c++·笔记·设计模式·备忘录模式
愤豆6 小时前
07-Java语言核心-JVM原理-JVM对象模型详解
java·jvm·c#
张人玉6 小时前
上位机项目笔记
笔记·c#·上位机
无籽西瓜a7 小时前
【西瓜带你学设计模式 | 第二期-观察者模式】观察者模式——推模型与拉模型实现、优缺点与适用场景
java·后端·观察者模式·设计模式
小杍随笔8 小时前
【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】
开发语言·rust·c#
呆子也有梦8 小时前
redis 的延时双删、双重检查锁定在游戏服务端的使用(伪代码为C#)
redis·后端·游戏·缓存·c#
xyyaihxl10 小时前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
第二只羽毛10 小时前
C++ 高并发内存池2
大数据·开发语言·jvm·c++·c#