點菜(簡單工廠模式)

来源:http://www.cnblogs.com/bb-love-dd/archive/2016/10/31/6015531.html
-Advertisement-
Play Games

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _016 { //抽象類(菜) public abstract class Food { //抽象方法,輸出 ...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _016
{
    //抽象類(菜)
    public abstract class Food
    {
        //抽象方法,輸出點了的菜
        //抽象方法接下來會被重寫,直接調用抽象方法就可以
        public abstract void Print();//抽象方法沒有方法體
    }

    //列印土豆絲 類
    //重寫抽象方法
    public class tds : Food
    {
        public override void Print()
        {
            Console.WriteLine("來份土豆絲");
        }
    }
    //列印西紅柿 類
    //抽血抽象方法
    public class xhs : Food
    {
        public override void Print()
        {
            Console.WriteLine("來份西紅柿");
        }
    }

    //工廠類 廚師
    public class cs
    {
        public static Food CreateFood(string t)
        {
            Food food = null;
            if (t.Equals("土豆絲"))
            {
                food = new tds();
            }
            else if (t.Equals("西紅柿"))
            {
                food = new xhs();
            }

            return food;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Food food1 = cs.CreateFood("土豆絲");
            food1.Print();

            Food food2 = cs.CreateFood("西紅柿");
            food2.Print();

            //手動輸入土豆絲或是西紅柿
            try
            {
                Food food3 = cs.CreateFood(Console.ReadLine());
                food3.Print();
            }
            catch { }

            Console.ReadKey();
        }
    }
}
#region 複製粘貼的 工廠模式介紹
//  簡單工廠模式的介紹
//說到簡單工廠,自然的第一個疑問當然就是什麼是簡單工廠模式了? 
//在現實生活中工廠是負責生產產品的,同樣在設計模式中,簡單工廠模式
//我們也可以理解為負責生產對象的一個類, 我們平常編程中,當使用
//”new”關鍵字創建一個對象時,此時該類就依賴與這個對象,也就是
//他們之間的耦合度高,當需求變化時,我們就不得不去修改此類的源碼,
//此時我們可以運用面向對象(OO)的很重要的原則去解決這一的問題,
//該原則就是——封裝改變,既然要封裝改變,自然也就要找到改變的代碼,
//然後把改變的代碼用類來封裝,這樣的一種思路也就是我們簡單工廠模式的實現方式了。

//  優點與缺點
//看完簡單工廠模式的實現之後,你和你的小伙伴們肯定會有這樣的疑惑(因為我學習的時候也有)——這樣我們只是把變化移到了工廠類中罷了,好像沒有變化的問題,因為如果客戶想吃其他菜時,此時我們還是需要修改工廠類中的方法(也就是多加case語句,沒應用簡單工廠模式之前,修改的是客戶類)。我首先要說:你和你的小伙伴很對,這個就是簡單工廠模式的缺點所在(這個缺點後面介紹的工廠方法可以很好地解決),然而,簡單工廠模式與之前的實現也有它的優點:
//簡單工廠模式解決了客戶端直接依賴於具體對象的問題,客戶端可以消除直接創建對象的責任,而僅僅是消費產品。簡單工廠模式實現了對責任的分割。
//簡單工廠模式也起到了代碼復用的作用,因為之前的實現(自己做飯的情況)中,換了一個人同樣要去在自己的類中實現做菜的方法,然後有了簡單工廠之後,去餐館吃飯的所有人都不用那麼麻煩了,只需要負責消費就可以了。此時簡單工廠的燒菜方法就讓所有客戶共用了。(同時這點也是簡單工廠方法的缺點——因為工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都會受到影響,也沒什麼不好理解的,就如事物都有兩面性一樣道理)
//雖然上面已經介紹了簡單工廠模式的缺點,下麵還是總結下簡單工廠模式的缺點:
//工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都會受到影響(通俗地意思就是:一旦餐館沒飯或者關門了,很多不願意做飯的人就沒飯吃了)
//系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,這樣就會造成工廠邏輯過於複雜。
//瞭解了簡單工廠模式之後的優缺點之後,我們之後就可以知道簡單工廠的應用場景了:
//當工廠類負責創建的對象比較少時可以考慮使用簡單工廠模式()
//客戶如果只知道傳入工廠類的參數,對於如何創建對象的邏輯不關心時可以考慮使用簡單工廠模式
#endregion

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

-Advertisement-
Play Games
更多相關文章
  • 本文轉載自:http://www.cnblogs.com/xinaixia/p/4920630.html 1. 獲取數據的方式[1]DataReader 為線上操作數據, DataReader會一直占用SqlConnection連接,在其獲得數據過程中其它操作不可以再使用SqlConnection連 ...
  • 由於邏輯需要,我希望能在EF Core實例化實體時,拿到實體並執行相關代碼,所以我就研究了一番EF Core,得到以下方法。 1.創建實體初始化類,繼承EntityMaterializerSource 這個類是,我們需要註入到EF Core當中去的。 2.創建EF Core擴展 創建擴展後,在App ...
  • Firebug中調試中的js腳本中中文內容顯示為亂碼 設置 頁面 UFT-8 編碼沒用, 解決方法:點擊 “Firebug”工具欄 中的“選項” “重置所有FireBug選項”即可正常使用 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Filestream複製視頻文件 { class Program { st ...
  • 本文版權桂博客園和作者吳雙共同所有,轉載和爬蟲請註明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 寫在前面 大家好我是博客園的蝸牛,博客園的蝸牛就是我。學習這篇文章,你不需要任何nodejs基礎,當然你有的話就更順利了。園子里有很多全棧或者是前端後臺 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace 讀寫文件 { class Program { static void Ma ...
  • C#中的訪問修飾符internal可以使類型在同程式集中可以被相互訪問。但有時會有這樣一個要求,我們希望一個程式集中的類型可以被外部的某些程式集訪問,如果設置成public的話,就被所有的外部程式集訪問;或是在單元測試中,測試代碼在另一個程式集中運行,但需要訪問正在測試的標記為internal的程式 ...
  • 0x00、為什麼要擴展 因為我的伺服器是小水管,載入一個完整的網站往往需要很久,想加速網站載入速度,靜態文件最好是分離出來,所有就想到了擴展UrlHelper,用來支持CDN載入文件。 0x01、論引用靜態文件的幾種方法 以 jquery-1.11.0.min.js 為例,一般常用的有以下兩種(我自 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...