两种设计模式(1)==>>“简单工厂”
我们以做一个计算器为例,给大家介绍简单工厂的应用:
效果:
这里我们使用 继承 ,虚方法, 简单工厂的设计模式来完成
首先,我们除了搭好窗体外,我们应该把我们的一些类准备好:
1.计算的父类Calculation
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //父类(虚) 计算类 public abstract class Calculation { //第一个操作数 public double Numleft { get; set; } //第二个操作数 public double NumRight { get; set; } //运算符 public string Operator { get; set; } //虚方法 public abstract double Cal(); } }
2.然后就是,加,减,乘,除 的子类
01.加法类 Add
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //加法 public class Add:Calculation { public override double Cal() { double result = Numleft + NumRight; return result; } } }
02.减法类 Sub
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //减法 public class Sub:Calculation { public override double Cal() { double result = Numleft - NumRight; return result; } } }
03.乘法类 Mul
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //减法类 public class Mul:Calculation { public override double Cal() { double result = Numleft * NumRight; return result; } } }
04.除法类 Div
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //除法类 public class Div:Calculation { public override double Cal() { //除法中 除数是不能为0 if (NumRight==0) { throw new Exception("除数不能为0"); } double result = Numleft / NumRight; return result; } } }
3.最后就是准备 “简单工厂” 的类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 计算器_简单工厂_ { //工作类 public class Factory { public static Calculation Cal(string ope) { //初始化父类对象 Calculation calculation = null; //根据传来的运算符实例化 switch (ope) { case"+": calculation = new Add(); break; case "-": calculation = new Sub(); break; case "*": calculation = new Mul(); break; case "/": calculation = new Div(); break; } //返回实例化的对象 return calculation; } } }
4.一切准备好后,我们来看看在窗体中是如何用的呐!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 计算器_简单工厂_ { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void btnCal_Click(object sender, EventArgs e) { //外层try作用:判断输入的操作数是否正确 try { //分别获得要计算的值 double num1 = Convert.ToDouble(txtLift.Text); double num2 = Convert.ToDouble(txtRight.Text); string ope = cmbstring.Text; //把获得的运算符传达“简单工厂” Calculation cal = Factory.Cal(ope); double result = 0; //赋值(最会忘记) cal.Numleft = num1; cal.NumRight = num2; //内层try作用:判断当除法时除数是否为0 try { //知道需求,开始进行相应工作 result = cal.Cal(); } catch (Exception ex) { MessageBox.Show(ex.Message); } //显示结果 label1.Text = result.ToString(); } catch (Exception ex) { //如果输入不正确,则系统会提示“输入字符串的格式不正确” MessageBox.Show(ex.Message); } } } }
我们来总结一下我们“简单工厂”类的一些注意点吧:
1.方法是静态的,调用的时候不需要实例化
2.方法的返回值是父类 类型
3.方法是有参的