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

来源:http://www.cnblogs.com/heyongjun1997/archive/2016/03/04/5242037.html
-Advertisement-
Play Games

1.設計模式的概念: 設計模式:設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 2.設計模式的優點: 為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 ---------簡單工廠設計模式 所謂簡單工廠設計模式,就肯定有一個工廠類,


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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一次介紹的了Rookey.Frame v1.0快速開發平臺的整體功能,接下來會對各個功能點進行解析說明,今天給大家介紹下系統登錄功能。 用戶登錄 系統中基本上所有功能頁面都是從後臺代碼拼接後返回的,登錄頁面也不例外,請看下圖: 接下來看下後臺登錄的HTML: /// <summary> /// 獲
  • 年前用FineUI開發遇到了這樣一個問題,Grid多表頭合計行不能導出,後面到官方示例找了一下,慶幸的是找到了多表頭的導出示例。然後當時為了省事,直接就複製粘貼完事,也沒有仔細的研究代碼。後來運行一看,多表頭的問題是解決了,合計行的問題還是沒有解決。 由於到時要趕流程這個問題就暫時的放在了那裡,時間
  • 當一個App需要推出多語言版本時,就需要使用到【全球化與本地化】服務。 原理及過程 資源文件中包含了所有的控制項信息,通過導出這些控制項信息,修改其對應的相關屬性(比如TextBlock的Text屬性)的字元串,即可實現多語言版本。在資源文件中,控制項通過x:uid進行標示。 設置預設的本地化區域。比如z
  • 前一篇關於anti-forgery token問題的博文提到我們可以通過修改AntiForgeryConfig.UniqueClaimTypeIdentifier屬性來避免AntiForgeryToken生成的問題。但是也許你編譯運行後又得到了這樣一個錯誤: A claim of type 'htt...
  • kendo ui template的用法: Kendo UI 框架提供了一個易用,高性能的JavaScript模板引擎。通過模板可以創建一個HTML片段然後可以和JavaScript數據合併成最終的HTML元素。 Kendo 模板側重於UI顯示,支持關鍵的模板功能,著重於性能而不是語法上的方便。 模
  • <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoApplication.aspx.cs" Inherits="WebApplication1.DemoApplication" %> <!DOCTYPE html PUBLIC
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o
  • disruptor 用戶封裝自己的消費者,把消費者註入到消費者容器,消費者容器實現自動創建 緩存隊列,生產者; 文中用到的 disruptor C#移植源代碼 https://github.com/bingyang001/disruptor-net-3.3.0-alpha 作者博客 http://w
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...