首页 > 代码库 > 设计模式之简单工厂和单例模式

设计模式之简单工厂和单例模式

近段时间发现自己越来越懒了,老师早就讲过的东西,一直没有总结!百度了一下,给的答案是设计模式总共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;
       }