两种设计模式(1)==>>“简单工厂”

时间:2022-07-23 19:42:10

我们以做一个计算器为例,给大家介绍简单工厂的应用:

效果:

两种设计模式(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==)
{
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 = ; //赋值(最会忘记)
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.方法是有参的