近段时间发现自己越来越懒了,老师早就讲过的东西,一直没有总结!百度了一下,给的答案是设计模式总共23种。简单工厂属于其中一种,而单例模式并不是其中一种。今天总结下使用这两种模式写的项目。
设计模式:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
一:简单工厂
用简单工厂模式做出一个窗口程序计算器,之前写的控制台程序的计算器太简单了,老师说如果面试就只用一个Switch人家是不会要你的!
1:首先创建一个计算的父类是个抽象类,类里有两个参与运算的参数,和一个抽象的计算方法;
public abstract class Calc {
private int num1;
private int num2;
public int Num1
{
get { return num1; }
set { num1 = value; }
}
public int Num2
{
get { return num2; }
set { num2 = value; }
}
public abstract int MyCalc();
}
2:创建子类加、减、乘、除等都继承父类,子类参数都是继承父类一样的,唯一方法不同,每个子类都有自己不同的计算方法!
+:public class Add:Calc -:public class Sub:Calc *: public class Mul:Calc
{ { {
public override int MyCalc() public override int MyCalc() public override int MyCalc()
{ { {
return this.Num1 + Num2; return this.Num1 - this.Num2; return this.Num1*this.Num2;
} } }
} } }
/: public class Div:Calc
{
public override int MyCalc()
{
int result=0;
if (this.Num2!=0)
{
result=this.Num1/this.Num2;
}
else
{
MessageBox.Show("除数不能为0");
}
return result;
}
}
3:创建一个工厂类,一般名字书写习惯以Factory结尾,这个工厂类有一个静态的带参数的父类类型的方法,根据传进参数的不同,New出不同的子类!
public class CaculatorFactory
{
public static Calc CreateCalc(string oper)
{
Calc calc = null;
switch (oper)
{
case "+":
calc=new Add();
break;
case "-":
calc=new Sub();
break;
case "*":
calc=new Mul();
break;
case "/":
calc=new Div();
break;
}
return calc;
}
}
4:当点击窗口计算按钮的时候,调用工厂类的静态方法,根据下拉框所选的运算符作为方法的参数,得出的一个父类返回值类型,然后自定义一个父类类型接受一下!
把窗口TextBox的两个运算参数传给自定义父类类型的两个参数,再由传进去的运算符进入工厂类决定New哪个子类,然后父类调用子类的计算方法得出一个结果!
//01.获取操作数和运算符
int numLeft=Convert.ToInt32(txtNum1.Text);//第一个参与运算的参数
int numRight = Convert.ToInt32(txtNum2.Text);//第二个参与运算的参数
//运算符
string oper = cboOperator.Text;
Calc calc= CaculatorFactory.CreateCalc(oper);
calc.Num1 = numLeft;
calc.Num2 = numRight;
int result=calc.MyCalc();
txtResult.Text = result.ToString();
二:单例模式:单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。
For Example:我们一期的结业项目:MyKTV系统里有一个播放窗口,那时,每点击一次播放,程序就会创建出一个播放窗口,点的歌多了就卡机了,满屏都是播放窗口。
这个时候就需要用上单例模式了。
首先由于加载太耗时,VS不自带Windows Media Player组件,需要在工具箱下添加选择项COM组件下选择Windows Media Player组件添加进VS里,再拖到窗口上。
1:创建一个自定义窗体类,如:FrmPlay。
2:把系统自带的公有初始化组件方法改为私有
效果为: private FrmPlay()
{
InitializeComponent();
}
3:定义一个静态的和窗口类同类型的自定义变量
效果为:private static FrmPlay play;
4:再定义一个公有的静态窗口类型的方法
效果为:public static FrmPlay Get()
{
if (play == null)
{
play = new FrmPlay();
}
return play;
}