設計模式系列 - 簡單工廠模式

来源:https://www.cnblogs.com/hippieZhou/archive/2018/12/07/9938761.html
-Advertisement-
Play Games

簡單工廠模式,屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們創建對象時不會對客戶端暴露創建邏輯,而是通過一個統一的介面來指向新創建的對象。 介紹 在現實生活中,當我們去 4S 店購車時,我們不用考慮汽車的各個部件是如何生產的,而就可以提走一輛愛車。同樣的,在軟體開發過程中,當我們 ...


簡單工廠模式,屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們創建對象時不會對客戶端暴露創建邏輯,而是通過一個統一的介面來指向新創建的對象。

介紹

在現實生活中,當我們去 4S 店購車時,我們不用考慮汽車的各個部件是如何生產的,而就可以提走一輛愛車。同樣的,在軟體開發過程中,當我們需要訪問數據時,可以使用這種方法直接獲取到數據,而不用考慮數據的底層存儲是使用哪種存儲方式。

類圖描述

從上述類圖中我們可以發現,IShape 為介面類型,定義了所有形狀類型所具有的行為,然後具體的類型分別繼承該介面並實現相應行為。接著又定義了一個 ShapeFactory 來統一所有類型的創建,最後,上層通過調用 ShapeFactory 並轉遞相應參數來獲取具體類型的實例對象。

代碼實現

1、創建介面 IShape

public interface IShape
{
    void Draw();
}

2、定義相應形狀類並繼承 IShape 介面

public class Circle:IShape
{
    public void Draw()
    {
        Console.WriteLine("I am a Circle");
    }
}

public class Rectangle:IShape
{
    public void Draw()
    {
        Console.WriteLine("I am a Rectangle");
    }
}

public class Square:IShape
{
    public void Draw()
    {
        Console.WriteLine("I am a Square");
    }
}

3、創建一個工廠,用於生產指定類型的實體類對象

public enum ShapeType
{
    Circle,
    Rectangle,
    Square,
}

public class ShapeFactory
{
     public IShape GetShape(ShapeType shapeType)
     {
         IShape shape = null;
         switch (shapeType)
         {
             case ShapeType.Circle:
                 shape = new Circle();
                 break;
             case ShapeType.Rectangle:
                 shape  = new Rectangle();
                 break;
             case ShapeType.Square:
                 shape = new Square();
                 break;
         }
         return shape;
     }
}

4、上層調用

class Program
{
    static void Main(string[] args)
    {
        var  factory = new ShapeFactory();
        IShape shape = factory.GetShape(ShapeType.Rectangle);
        shape.Draw();

        Console.ReadKey();
    }
}

總結

從上述類圖我們可以發現,使用工廠模式可以對複雜對象的創建提供了統一管理。每增加一個類型,都需要增加一個具體類和修改相應的工廠類,對於這一點,在一定程度上會增加系統發雜度。同時對於簡單對象的創建,如果也使用這種方式的話就不太合適。


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

-Advertisement-
Play Games
更多相關文章
  • 在vue.js項目中,經常需要對數據實時更新——每隔xx秒需要刷新一次介面——即需要用到定時器相關原理。這篇文章主要介紹了vue項目每30秒刷新1次介面的實現方法,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 在vue.js項目中,經常需要對數據實時更新——每隔x ...
  • 1、我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype。這個屬性對應著一個對象,這個對象就是我們所謂的原型對象。如果函索作為普通函數調用prototype沒有任何作用。 當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性 指向該構造函數的原型對象,我們可以通過_ ...
  • 今日任務 使用JQuery發送請求局部刷新頁面 使用BootStrap製作一個響應式的頁面 使用BootStrap製作網站的首頁 教學目標 掌握什麼是響應式及響應式的原理 掌握BootStrap的柵格系統 瞭解BootStrap的其他組件及JS控制項 上次課內容: 什麼JQ : write less ...
  • 今日任務 使用JQuery完成頁面定時彈出廣告 定時器: ​ setInterval clearInterval ​ setTimeout clearTimeout 顯示: img.style.display = "block" 隱藏: img.style.display = "none" img ...
  • 今日任務 使用JS完成頁面定時彈出廣告 使用JS完成表單的校驗 使用JS完成表格的隔行換色 使用JS完成覆選框的全選效果 使用JS完成省市的聯動效果 JS控制下拉列表左右選擇 教學導航 1. 掌握JS中的BOM對象 2. 掌握JS中的常用事件 3. 掌握JS中的常用DOM操作 4. 瞭解JS中的內置 ...
  • 今日目標 使用CSS完成網站首頁的優化 使用CSS完成網站註冊頁面的優化 使用JS完成簡單的數據校驗 使用JS完成圖片輪播效果 教學目標: - 瞭解CSS的概念 - 瞭解CSS的引入方式 - 瞭解CSS的基本用法和常用的選擇器 - 瞭解CSS的盒子模型,懸浮和定位 - 瞭解JS的概念 - 掌握JS的 ...
  • **今日任務** 網站信息頁面案例 網站圖片信息頁面案例 網站友情鏈接頁面案例 網站首頁案例 網站註冊頁面案例 網站後臺頁面案例 教學導航 - 瞭解什麼是標記語言 - 瞭解HTML主要特性,主要變化以及發展趨勢 - 瞭解HTML的結構標簽 - 掌握HTML的主要標簽(字體,圖片,列表,鏈接,表單等標 ...
  • 調用 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...