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

    1.设计模式的概念:   

    设计模式:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

    2.设计模式的优点:

      为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

     

    ---------简单工厂设计模式

     所谓简单工厂设计模式,就肯定有一个工厂类,这个工厂类中有一个方法。

    1.对于这个方法的一些注意点:

    01.必须是静态的

    02.返回值是父类类型。

    03.传递参数(通过题目的不同给予不同的参数)

    eg:

    public static Pizza getdo(string type){}

    2.通过switch选择结构选择覆盖父类的子类

    创建父类对象,赋值为null

    Pizza pizza=null;

    switch(传入的参数

    {

          case 1:

            pizza=new ChessePizza();

           break;

           case 2:

          pizza=new pgPizza();

          break;

    }

    return pizza;

    ---------------------01简单工厂(制作比萨案例)---------------

    首先要创建一个父类比萨类:这个类是抽象的也就是说这个类是abstract修饰的。

    这个类中有一个抽象的方法,用于制作比萨。

     父类底层有量个子类分别是CheesePizza(奶酪比萨类)PgPizza(培根比萨类)

    子类必须重写父类的抽象的方法。

     //比萨类
       public abstract class Pizza
        {
           public abstract string Show();
        }
    
      //培根比萨
      public  class PgPizza:Pizza
        {
    
            public override string Show()
            {
                return "培根比萨制作完成!";
            }
        }
     //奶酪比萨
        public class CheesePizza:Pizza
        {
            public override string Show()
            {
                return "奶酪比萨制作完成!";
            }
        }
      //工厂类
       public class PizzaFactory
        {
           public static Pizza dopizza(string type) 
           {
               Pizza ps = null;
               switch (type)
               {
                   case "培根比萨":
                       ps = new PgPizza();
                       break;
                   case"奶酪比萨":
                       ps = new CheesePizza();
                       break;
                 
               }
               return ps;
    
           }
    
        }
    
     

    在form窗体中调用

    private void btndo_Click(object sender, EventArgs e)
            {
                if (rbBacon.Checked==true)
                {
    //调用工厂中的制作方法,返回值用父类类型接收,传入制作的比萨类型 Pizza ps
    = PizzaFactory.dopizza(rbBacon.Text); string work = ps.Show(); MessageBox.Show(work); } else { Pizza ps = PizzaFactory.dopizza(rbCheese.Text); string work = ps.Show(); MessageBox.Show(work); } }

    ---------------------02简单工厂(制作计算器)---------------

       //计算类:父类
        public abstract class Calculate
        {
            public double num1 { get; set; }//第一个操作数
            public double num2 { get; set; }//第二个操作数
           //抽象方法计算结果
            public abstract double Cal();
        }
    
    
    //加法计算
        public class Add:Calculate
        {
            public override double Cal()
            {
                return this.num1 + this.num2;
            }
        }
    
     //减法计算
       public class Reduce:Calculate
        {
           public override double Cal()
           {
               return this.num1 - this.num2;
           }
        }
    
     //乘法计算
        public class Ride:Calculate
        {
            public override double Cal()
            {
                return this.num1 * this.num2;
            }
        }
    
    
      //除法计算
       public  class Div:Calculate
        {
            public override double Cal()
            {
                double result = 0.0;
                if (this.num2 == 0)
                {
                    throw new Exception("被除数不能为0");
                }
                else 
                {
                      result=this.num1 / this.num2;
    
                }
                return result;
    
            }
        }
    
     //工厂
      public  class OpearFactory
        {
          public static Calculate Calresult(string opear) 
          {
              Calculate cal = null;
              switch (opear)
              {
                  case"+":
                      cal = new Add();
                      break;
                  case "-":
                      cal = new Reduce();
                      break;
                  case "*":
                      cal = new Ride();
                      break;
                  case "/":
                      cal = new Div();
                      break;
              }
              return cal;
          
          }
        }

    在From窗体中调用

    当点击窗口计算按钮的时候,调用工厂类的静态方法,根据下拉框所选的运算符作为方法的参数,得出的一个父类返回值类型,然后自定义一个父类类型接受一下!

    把窗口TextBox的两个运算参数传给自定义父类类型的两个参数,再由传进去的运算符进入工厂类决定New哪个子类,然后父类调用子类的计算方法得出一个结果!

     private void btnok_Click(object sender, EventArgs e)
            {
               //获取第一个操作数
              double num1 = Convert.ToInt32(txtnum1.Text);
                //获取第二个操作数
              double num2 = Convert.ToInt32(txtnum2.Text);
                //获取运算符
                string opear = cboOpear.Text;
                //传入opear返回值类型为父类类型
               Calculate cal= OpearFactory.Calresult(opear);
               cal.num1 = num1;
               cal.num2 = num2;
               double result = 0.0;
               try
               {
                   //调用子类对应方法
                    result = cal.Cal();
               }
               catch (Exception ex)
               {
    
                   MessageBox.Show(ex.Message);
               }
             
              lblresults.Text = result.ToString();
            }

    -----------------------单例设计模式---------------
    单例模式的概念:

    单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,

    并为客户程序提供一个获取该实例的全局访问点。简单的说 就是这个类只能被实例化一次,

    以后取出来的都是它的实例.

    在S1阶段结束时做了一个KTV点歌系统,每次点击一个窗口进行播放,都会new出一个窗口,如何让他只new一次,这就涉及到了单例设计模式:

    01:创建一个窗体类FrmKTVplay。

    02:把系统公有初始化组件方法改为私有

        private  FrmKTVplay()
            {
                InitializeComponent();
            }

    03:定义一个静态的和窗口类同类型的自定义变量

    效果为:private static FrmKTVplay play;

    04:再定义一个公有的静态窗口类型的方法

    效果为:public static FrmPlay Show()
           {
               if (play == null)
               {
                   play = new FrmKTVplay();
               }
               return play;
           }

  • 相关阅读:
    win10 uwp 读取保存WriteableBitmap 、BitmapImage
    win10 uwp 读取保存WriteableBitmap 、BitmapImage
    win10 uwp 按下等待按钮
    win10 uwp 按下等待按钮
    win10 uwp 右击选择 GridViewItem
    win10 uwp 右击选择 GridViewItem
    PHP array_column() 函数
    PHP array_chunk() 函数
    PHP array_change_key_case() 函数
    PHP array() 函数
  • 原文地址:https://www.cnblogs.com/hyjj/p/5242037.html
Copyright © 2011-2022 走看看