前言
上一篇文章写了如何利用RabbitMQ做个简朴的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间缘故原由,先来说说设计模式中的简朴工厂模式吧!
在了解简朴工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、多态。
简述
工厂模式(Factory Pattern)是一种常用的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端袒露创建逻辑,并且是通过利用一个共同的接口来指向新创建的对象。
工厂模式的核心是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。这样客户端可以无需指定具体产品的类,只需通过工厂类即可得到所需的产品对象。
工厂模式重要分为三种类型:简朴工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。
本文重要讲解简朴工厂模式(Simple Factory Pattern)。
案例带入
下面利用C#控制台程序去写一个简易的盘算器,实现加减乘除。假如我没学过设计模式,我会这么写:- static void Main(string[] args)
- {
- Console.WriteLine("请输入数字A:");
- string A = Console.ReadLine();
- Console.WriteLine("请选择运算符号:(+、-、*、/):");
- string op = Console.ReadLine();
- Console.WriteLine("请输入数字B:");
- string B = Console.ReadLine();
- string result = "";
- switch (op)
- {
- case "+":
- result = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(B));
- break;
- case "-":
- result = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(B));
- break;
- case "*":
- result = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(B));
- break;
- case "/":
- result = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(B));
- break;
- default:
- Console.WriteLine("输入的运算符号有误!");
- break;
- }
- Console.WriteLine("结果:" + result);
- }
复制代码 上述代码乍一看没问题,实则隐蔽了许多陷阱,比如:
- 变量命名不规范
- 除数为0怎么办
- 输入的不是数字怎么办
- ......
优化
我们用面向对象的思想举行优化,重要体现在:可维护、可复用、可扩展、灵活性几个方面。通过封装、继承、多态来降低程序的耦合度。
封装
我们可以将运算逻辑封装成一个方法去实现,让主方法减轻负担。封装后:
Operation类- public class Operation
- {
- public static double GetResult(double num1, double num2, string op)
- {
- double result = 0d;
- switch (op)
- {
- case "+":
- result = num1 + num2;
- break;
- case "-":
- result = num1 - num2;
- break;
- case "*":
- result = num1 * num2;
- break;
- case "/":
- result = num1 / num2;
- break;
- }
- return result;
- }
- }
复制代码 Main方法- static void Main(string[] args)
- {
- try
- {
- Console.WriteLine("请输入数字A:");
- string strNumA = Console.ReadLine();
- Console.WriteLine("请选择运算符号:(+、-、*、/):");
- string op = Console.ReadLine();
- Console.WriteLine("请输入数字B:");
- string strNumB = Console.ReadLine();
- string result = "";
- result = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumA), Convert.ToDouble(strNumB), op));
- Console.WriteLine("结果:" + result);
- }
- catch (Exception e)
- {
- Console.WriteLine("发生异常:" + e.Message);
- }
- }
复制代码 松耦合
当我们完成封装后开始思索一个问题,假如背面有新的需求,需要增长一个开根运行,应该如何去修改?假如是我,我会在switch内里加一个分支,但是这样耦合度太高。我明明只需要去开根,但是却要让加减乘除到场进来,所以我们应该将加减乘除运算分离出来。
优化耦合度:- public class Operation
- {
- private double _num1;
- private double _num2;
- public double Num1 { get => _num1; set => _num1 = value; }
- public double Num2 { get => _num2; set => _num2 = value; }
- public virtual double GetResult()
- {
- return 0;
- }
- }
- //加法类
- public class AddOperation : Operation
- {
- public override double GetResult()
- {
- return Num1 + Num2;
- }
- }
- //减法类
- public class SubtractOperation : Operation
- {
- public override double GetResult()
- {
- return Num1 - Num2;
- }
- }
- //乘法类
- public class MultiplyOperation : Operation
- {
- public override double GetResult()
- {
- return Num1 * Num2;
- }
- }
- //除法类
- public class DivideOperation : Operation
- {
- public override double GetResult()
- {
- if (Num2 == 0)
- throw new DivideByZeroException("除数不能为0");
- return Num1 / Num2;
- }
- }
复制代码 我创建了Operation基类,并定义了2个成员变量_num1和_num2,同时定义了一个GetResult虚方法。同时分别创建了加减乘除子类去重写GetResult方法来降级耦合度。
回归正题(简朴工厂模式)
我们需要通过简朴工厂模式,来让程序知道该实例化谁。需要来创建一个工厂类:- public class OperationFactory
- {
- public static Operation CreateOperation(string operation)
- {
- switch (operation)
- {
- case "+":
- return new AddOperation();
- case "-":
- return new SubtractOperation();
- case "*":
- return new MultiplyOperation();
- case "/":
- return new DivideOperation();
- default:
- return null;
- }
- }
- }
复制代码 创建了工厂类有什么好处呢,好处就是,只需要输入运算符号,工厂就能本身实例化出合适的对象,通过多态,返回父类的方法实现了盘算器的盘算结果。
Main方法
通过简朴工厂模式,让我们在盘算加减乘除的时候只需要去增长对应的子类就行了,下面的代码举行加法运行时,通过传入+号让工厂去帮我们实例化子类。- static void Main(string[] args)
- {
- try
- {
- // 简单工厂模式
- var oper = OperationFactory.CreateOperation("+");
- oper.Num1 = 10;
- oper.Num2 = 5;
- Console.WriteLine(oper.GetResult());
- }
- catch (Exception e)
- {
- Console.WriteLine("发生异常:" + e.Message);
- }
- }
复制代码 类图
讲完简朴工厂模式后,简简朴单复现一下类图:
小小知识点
- 接口:夸大“做什么”,即接口定义了对象应该做什么,而不关心它是如何做的。
- 虚方法:夸大“如何做”,即基类提供了一种实现方式,但允许派生类根据需要举行修改。
参考资料
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |