zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂和单例模式

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

        
            
                
          
       

  • 相关阅读:
    iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)
    iOS中 学会如何对sqlite3 进行封装
    杭电ACM2012素数判定
    杭电ACM2503a/b+c/d
    杭电ACM2005第几天
    杭电ACM2034人见人爱AB
    杭电ACM2502月之数
    杭电ACM2001计算两点间的距离
    杭电ACM2002计算求得体积
    杭电ACM2033人见人爱A+B
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/3734974.html
Copyright © 2011-2022 走看看