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;
           }

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/hyjj/p/5242037.html
Copyright © 2011-2022 走看看