程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 設計模式---簡單工廠和單例,設計模式---工廠

設計模式---簡單工廠和單例,設計模式---工廠

編輯:C#入門知識

設計模式---簡單工廠和單例,設計模式---工廠


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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved