設計模式之簡單工廠模式(C#語言描述)

来源:https://www.cnblogs.com/caoruipeng/archive/2018/09/19/9678153.html
-Advertisement-
Play Games

嚴格意義上來說,簡單工廠模式並不屬於GoF的23種設計模式,但是它是學習其他工廠模式的基礎和前提條件。理解了簡單工廠模式,學習工廠方法模式和抽象工廠模式會比較容易一些。 簡單工廠模式的定義 定義一個工廠類,他可以根據不同的參數返回不同類的實例。通常情況下,被創建的類的實例通常都具有共同的父類。 簡單 ...


嚴格意義上來說,簡單工廠模式並不屬於GoF的23種設計模式,但是它是學習其他工廠模式的基礎和前提條件。理解了簡單工廠模式,學習工廠方法模式和抽象工廠模式會比較容易一些。

簡單工廠模式的定義

定義一個工廠類,他可以根據不同的參數返回不同類的實例。通常情況下,被創建的類的實例通常都具有共同的父類。

簡單工廠模式又可以稱之為靜態工廠方法模式,因為創建對象實例的方法通常都是靜態方法。

在簡單工廠模式中,只需要記住一點。一個簡單的參數可以即可獲得所需的對象實例。

簡單工廠模式的UML圖如下:

  簡單工廠模式包含三個角色:

   1、工廠角色(Factory)該類是簡單工廠的核心,我們所需要的對象實例就是這個類幫我們創建的,它裡面有一個靜態方法GetProduct(string productType),我們通過傳入產品類型(productType)來得到我們想要的產品。

   2、抽象產品角色(AbstractProduct):該類是所有產品的父類。它可以是介面或者抽象類。只有這樣我們才能給工廠的GetProduct(string productType)方法定義返回值。

   3、實體產品(ConcreteProductA,ConcreteProductB,ConcreteProductC):這些類是簡單工廠最終要創建的目標,也是客戶端最終想要的對象實例。

現在來假設一種場景,我們開發過程中,肯定會用到按鈕,圓形按鈕、正方形按鈕、矩形按鈕等等,在程式的很多地方我們都可能會復用這些按鈕。我們可以通過一個簡單工廠來幫助我們創建這些按鈕。

首先我們要聲明工廠要生產的產品(各種按鈕)類

    public class Button
    {
        public virtual void OnClick()
        {

        }
    }
    public class RoungButton:Button
    {
        public override void OnClick()
        {
            Console.WriteLine("點擊了圓形按鈕!");
        }
    }
    public class SquareButton:Button
    {
        public override void OnClick()
        {
            Console.WriteLine("點擊了正方形按鈕!");
        }
    }
    public class RectangleButton:Button
    {
        public override void OnClick()
        {
            Console.WriteLine("點擊了矩形按鈕!");
        }
    }

其次是我們的(靜態工廠類)

public class ButtonFactory
    {
        public static Button CreateButton(string type)
        {
            Button btnObj = null;
            switch (type)
            {
                case "round":
                    btnObj = new RoungButton();
                    break;
                case "square":
                    btnObj = new SquareButton();
                    break;
                case "rect":
                    btnObj = new RectangleButton();
                    break;
            }
            return btnObj;
        }
    }

在此處還有一些要說明的要點。

簡單工廠類幫助我們創建的是一類產品,這一類產品有一個共同的父類,這個父類是作為工廠方法的返回值來使用的。如果沒有這個共同的父類,我們的程式就需要用object作為返回值,然後在程式中進行強制轉換,這個明顯是非常不友好的編程。而作為一名程式員,在程式中進行大量的裝箱和拆箱操作是比較耗費性能的,良好的編程習慣中,也應該儘量減少裝箱拆箱的操作。

然後我們就可以在控制台調試我們的程式了

        static void Main(string[] args)//文件名的修改
        {
            Button roundBtn = ButtonFactory.CreateButton("round");
            roundBtn.OnClick();
            Button squareBtn = ButtonFactory.CreateButton("square");
            squareBtn.OnClick();
        }

程式的運行結果如下圖:


最後給大家介紹一個和技術相關的付費問答平臺、閱讀平臺-技易  歡迎訪問:http://www.seekwd.com

歡迎關註官方微信號:

 



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

-Advertisement-
Play Games
更多相關文章
  • 題意 題目鏈接 給出一個字元串,每次操作可以使得字元串縮短一位,且第$i$位必須要保證與變換前的這一位或下一位相同, 問使得整個字元串全相同最少的操作次數 Sol 300P的題我都要想10min啊,還是太菜了。。 首先我們可以枚舉一個字母,強行讓他成為最後的答案 對於末尾與它不同的數只能一個個刪掉, ...
  • import requests from requests.exceptions import RequestException import re import json from multiprocessing import Pool def get_one_page(url): headers... ...
  • 異常處理,是編程語言或電腦硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。 1.異常的類型 異常的類型多種多樣,常見的異常有: 其他的異常: Exception可以捕獲任意異常 2.捕獲異常,處理異常 只有將對應的異常類型捕獲才能進行異常的處理 異 ...
  • 文件名全小寫,可使用下劃線 包應該是簡短的、小寫的名字。如果下劃線可以改善可讀性可以加入。如mypackage。 模塊與包的規範同。如mymodule。 類總是使用首字母大寫單詞串。如MyClass。內部類可以使用額外的前導下劃線。 函數&方法函數名應該為小寫,可以用下劃線風格單詞以增加可讀性。如: ...
  • 深淺拷貝 淺拷貝 a=[[1,2],3,4] b=a[:] #b=a.copy() 淺拷貝 作用 輸出 ['Xiaomei', 345, [15000, 6000]] 淺拷貝copy.copy() 深拷貝copy.deepcopy() 輸出 ['Xiaomei', 345, [15000, 6000 ...
  • 條件語句的執行過程: if 條件判斷註意:1.每個條件後面要使用冒號 : ,表示條件為True時要執行的代碼;2.使用縮進來劃分代碼塊,相同縮進數的語句在一起組成一個代碼塊。 if...else,單條件判斷 if...elif...else,多條件判斷 ...
  • using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; namespace Web.Code.DA... ...
  • 轉眼九月份了,忙忙碌碌 發現今年還沒開過張,寫一篇吧。 15年在空閑時就倒騰過angularjs那玩意兒 ,覺得還是挺好的,李金龍那厚厚的一本書,只不過沒有系統化應用。最主要的是原來有一個東西沒有用到 那就是路由。在中衡的時候看到黃國文同志用那種全ajax的方式做的網站,那感覺。。。現在公司竟然也這 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...