最近在看大话设计模式,一直都把里面的代码都本身亲手敲一遍去理解这些设计模式的含义,并且都在作着笔记,可是寻思着。应该拿出来和你们一块儿交流共享,更但愿你们可以指出不足。因此打算把这些东西拿出来你们一块儿点评点评。设计模式
以后的内容都纯属我的理解,但愿不会误导别人。ide
今天先说说第一个,简单工厂模式。学习
咱们举个简单的例子,不少人再讲简单工厂模式的时候相比都是会拿这个案例来作例子,计算器。spa
咱们设计一个简单的计算器,只须要实现加减乘除这四个功能便可。设计
对于面向过程的思惟来看,加减乘除无非是四个方法,咱们写好这几个方法,而后传入参数,获取返回值便可。对象
可是咱们若是用面向对象的思想来看,加减乘除其实都是一个对象,而这个对象的父类,其实就是 运算(Operation) 。blog
因此咱们能够定一个抽象类,让加减乘除都来继承这个父类(Operation)在父类中咱们给出一个方法,就叫作OperationNum吧。继承
参数两个,分别是要计算的两个数,返回值 返回计算后的结果。string
加减乘除继承了这个父类,而且实现具体的计算方法。这时候,咱们怎么来用简单工厂呢?it
咱们创建一个工厂静态类,这个类中有一个静态方法,参数是运算符,
根据用户输入的运算符,咱们来在工厂产生相对应的子类,而后以父类的姿态返回他,而后客户端代码只须要调用这个父类对象的OperationNum方法便可。
这里涉及到里氏转换原则,里氏转换原则以下:
1.子类对象能够直接赋值给父类变量
2.父类对象能够强制类型转化为【对应的】 子类对象(重要)
子类扩展的方法和属性 转换为父类时候 父类访问不到,可是再强制转换为对应的子类时候会再次显示。由于在转换父类的时候被隐藏了
红薯的例子,把红薯装在一个食品盒子里,虽然从外观上发生了变化,可是本质它仍是一个红薯。当咱们拆开这个食品盒子,获得的也只能是红薯而不多是其余的食物。
至关于打一个包 本质没有变化
下面给出一个图,来帮助你们理解这个简单
下面再给出一些代码帮助你们理解
//抽象父类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器抽象 { abstract class Operation { public abstract int Run(int num1, int num2); } }
//加减乘除子类,只给出一个方便理解 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器抽象 { class Cut:Operation { public override int Run(int num1, int num2) { return num1 - num2; } } }
//工厂类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器抽象 { class FactoryClass { static Operation op = null; public static Operation Panduan(string mark) { switch (mark) { case "+": op = new Add(); break; case "-": op = new Cut(); break; case "*": op = new Ride(); break; case "/": op = new Division(); break; default :;break; } return op; } } }
//客户端代码 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("请输入第一个数:"); int num1 = int.Parse(Console.ReadLine()); Console.WriteLine("请输入第二个数:"); int num2 = int.Parse(Console.ReadLine()); Console.WriteLine("请输入运算符:"); string mark = Console.ReadLine(); Operation opc = FactoryClass.Panduan(mark); if (opc != null) { Console.WriteLine(opc.Run(num1, num2)); } else { Console.WriteLine("无效的运算符!"); } Console.ReadKey(); } } }
本人尚在学习阶段,但愿有写的很差的地方,你们指正。