1. 程式人生 > >【設計模式】簡單工廠模式與工廠方法模式詳細解讀

【設計模式】簡單工廠模式與工廠方法模式詳細解讀

1.前言 

設計模式,各具特色,今天在此總結一下常見模式中 簡單工廠模式與工廠方法模式的區別與聯絡

2.兩種模式概要

   1. 簡單工廠模式 

   2. 工廠方法模式

  •   工廠方法模式又稱工廠模式,也叫虛擬構造器模式屬於類的建立型模式
  •   在工廠方法模式中,父類負責定義建立物件的公共介面,而子類則負責生成具體的物件.這樣做的目的是將類的例項化操作延遲到子類中完成.由子類決定例項化哪個類

   工廠方法模式結構圖:  

   

3.兩種模式的對比  

            對於這兩種模式,請參照下表 :

簡單工廠模式

工廠方法模式

型別

建立型模式

建立型模式

概念

簡單工廠模式的實質是由一個工廠類根據傳入的引數,動態決定應該建立哪一個產品類(這些產品類繼承自一個父類或介面)的例項。

定義了一個用於建立物件的介面,讓子類決定例項化哪一個類, 工廠方法使一個類的例項化延遲到其子類

特點

無需瞭解這些物件是如何建立如何組織的

粒度很小的設計模式,是簡單工廠模式的衍生 一個抽象工廠對應一個抽象產品

優點

1.       含有必要的邏輯判斷 ,隨時可以建立產品類的例項

2.       客戶端可以避免直接建立產品物件的責任

3.       耦合性低,明確區分了各自的職責

4.       有利於軟體體系結構的優化

1.       克服了簡單工廠模式的缺點

2.       具體工廠類只完成單一的任務

3.       程式碼簡潔

4.       完全滿足OCP,有很好的擴充套件性

缺點

1.       當產品有複雜的多層次等級結構時,工廠類只有自己,以不變應萬變

2.       工廠類集中了所有產品的建立邏輯,一旦不能正常工作,整個系統都收到影響

3.       系統擴充套件困難

4.       違背了開放—封閉原則

1.       不易於維護

2.       當同時需要修改多個產品類時,修改麻煩

適用範圍

1.       建立的物件比較少

2.       客戶只知道傳入了工廠類的方法

1.       當一個類不知道它所必須建立物件的類或一個類希望由子類來指定它所建立的物件時

2.       當類將建立物件的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一資訊區域性化時

共同點

本質都是將不變的部分提取出來,將可變的部分留作介面,以達到最大程度上的複用。

 

4.兩種模式結構圖 

    此處的結構圖以及下面的對比程式碼都是以一個簡單的計算器功能為例子,包含四種基本運算加、減、乘、除。 

   1.簡單工廠模式

     

   2.工廠方法模式

     

  註釋: 

   在簡單工廠模式中,一個工廠類處於對產品類進行例項化的中心位置,它知道每一個產品類的細節,並決定適合哪一個產品應當被例項化.簡單工廠模式的優點是能夠使客戶端獨立於產品的建立過程,並且在系統中引入新產品時,不必對客戶端進行修改.缺點是當有新產品加入到系統的時候,必須修改工廠類,以加入必要的處理邏輯.   簡單工廠模式的致命缺點就是處於核心地位的工廠類因為一旦它無法確定要對哪個類進行例項化,就無法使用該模式,而工廠方法模式則可以很好的解決這一問題

       在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶端隱藏了哪種具體產品類將被例項化這一細節,工廠方法模式的核心是一個抽象工廠類各種具體工廠類通過抽象工廠類將工廠方法繼承下來如此使得客戶可以只關心抽象產品和抽象工廠,完全不用理會會返回哪一種具體產品,也不用關心它是如何被具體工廠建立的

 5.兩種模式程式碼

  1.簡單工廠模式   

public class OperationFactory    ///建立了一個工廠,使用者已輸入符號,工廠就會判斷怎麼計算了
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            { 
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
                case "*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }
}

    2. 工廠方法模式 

 interface Ifactory
    {
        Operation CreateOperation();
    }
    class SubFactory  : Ifactory   //減法類工廠
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    class AddFactory : Ifactory   //加法類工廠
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
    class MulFactory : Ifactory   //乘法類工廠
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    class DivFactory : Ifactory   //除法類工廠
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }
  

    註釋:  

      對於兩種模式在程式碼方面的應用看  ,簡單工廠模式,如果需要新增功能需要修改 工廠類,而工廠方法模式實現時,客戶端需要決定例項化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端程式碼來進行,你若要加功能,本來是修改工廠類,現在修改的是客戶端,工廠模式實際是是簡單模式的一種演化。  工廠模式有效的避免了簡單工廠模式中違背開放--封閉原則的限制,同時也加你了耦合性,增加了擴充套件性  。也就是說工廠方法模式 是簡單工廠模式的進一步推廣!  

     其實無論應用哪種設計模式,本質上都是提出不變的東西,將可變的東西作為介面,以達到最大程度上的複用,和擴充套件,而在開發過程中我們該用什麼模式,就得根據需要來確定了。每種模式各有自己的利弊好壞。而如何利用這些模式,什麼時間去用,就看我們的技術了吧!  這也就是菜鳥和大神的區別吧!  大神是用最少的投資 發揮最大的效益!  這就是我們這些人的奮鬥目標 ! 

      本篇系統的總結了一下兩種模式,歡迎交流指導!  

相關推薦

GIT學習GIT的安裝使用方法

Git是什麼? Git是目前世界上最先進的分散式版本控制系統(沒有之一)。 工作原理 / 流程: Workspace:工作區 Index / Stage:暫存區 Repository:倉庫區(或本地倉庫) Remote:遠端倉庫   實際專案開發中,我們經常會用一些版本

設計模式簡單工廠工廠方法抽象工廠的區別

前言 為什麼會出現工廠,工廠方法與簡單工廠還有抽象工廠到底有啥區別,什麼時候能用到這些呢,如果你對於這些不是很清晰,那麼你可以看看小編的這篇部落格! 這裡所有的類圖均用基本演算法為例子,這樣會有明顯的對比! 一、簡單工廠模式 1、我們在例項化物件的時候通

設計模式簡單工廠模式工廠方法模式詳細解讀

1.前言  設計模式,各具特色,今天在此總結一下常見模式中 簡單工廠模式與工廠方法模式的區別與聯絡 2.兩種模式概要    1. 簡單工廠模式     2. 工廠方法模式   工廠方法模式又稱

設計模式簡單工廠模式工廠方法模式

產生 for plm nbsp osc rbm play stp mage > 簡單工廠模式 顧名思義,此模式的設計結構是簡單的,核心是生產對象。 一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。 簡單工廠

設計模式簡單工廠模式

jsb 工廠模式 tle virt -m 虛函數 ios efault def 以面向對象的思想和簡單工廠模式。寫一個C++計算器程序,代碼例如以下: #include <iostream> using namespace std;

設計模式簡單工廠模式 |工廠方法模式 |抽象工廠模式

簡單工廠模式 由三種角色組成: 1、工廠類角色:是簡單工廠模式的核心,含有一定的商業邏輯和判斷邏輯。 2、抽象產品角色:一般是具體產品繼承的父類或者實現的介面。 3、具體產品角色:工廠類所建立的物件就是此角色的例項。 用一個單獨的類來做這個創在例項的過程,這就

設計模式簡單工廠模式(Simple Factory)

思想 簡單工廠模式,因為用於建立例項的方法是靜態的,又稱為靜態工廠方法模式。在該模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有相同的父類。 結構 組成(角色) 作用

C++設計模式簡單工廠工廠方法

#ifndef __FACTORYMETHOD_H__ #define __FACTORYMETHOD_H__ #include <iostream> #include <str

設計模式-簡單工廠模式

一、介紹 簡單工廠模式我們可以理解為負責生產物件的一個類,我們平常程式設計中,當時用"new"關鍵字建立一個物件時,此時該類就依賴與這個物件,也就是他們之間的耦合度高,當需求變化時,我們就不得不去修改此類的原始碼,此時我們可以運用面向物件(OO)的很重要的原則去解決這一問題,該原則就是——封

設計模式簡單工廠模式——以一個簡單的計算器為例

本文內容參考自《大話設計模式》(程傑 著) 注:以下程式碼為C#實現 1.拙劣的程式碼 class Program { static void Main(string[] args) { Console.

設計模式 簡單工廠模式

簡單工廠模式解釋:         簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同

設計原則軟體設計模式六大原則---學習

又有一種說法:   http://www.cnblogs.com/yuanhailiang/p/9432198.html ———————————————————————————— 原文:https://www.cnblogs.com/zhanghengscnc/p/8299

java設計模式之 單例(Singleton)模式

1. 單例模式的定義         單例模式(Singleton Pattern)是一個比較簡單的模式,其原始定義如下:Ensure a class has only one instance, and provide a global point of access

設計優化- 正確使用 Value Object 模式

在J2EE 軟體開發中,通常會對系統模組進行分層,如下圖所示: 展示層主要負責資料的展示,業務路基層負責具體的業務邏輯處理,而持久層負責資料庫等持久化操作。 大型系統中,這些層次很有可能會被分離,部署在不同的伺服器上。而在兩個層次之間可能通過遠端呼叫 RMI 等方式進行

java設計模式之 建造者(Builder)模式

        我們還是舉上一節的例子:生產汽車。上一節我們通過模板方法模式控制汽車跑起來的動作,那麼需求是無止境的,現在如果老闆又增加了額外的需求:汽車啟動、停止、鳴笛引擎聲都由客戶自己控制,他想要什麼順序就什麼順序,那該如何做呢? 1. 汽車無休止的改造       

設計模式第四篇:建造者模式也沒那麼難

![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3c68df3e1ac44ba68c613b630fa5c43f~tplv-k3u1fbpfcp-zoom-1.image) # 一 引言 說明:如果想要直接閱讀定義等理論內容,可以直接跳轉到第二大點 在生活

設計經驗3、燒錄QSPI Flash以及配置mcs檔案的載入速度傳輸位寬

一、軟體與硬體平臺        軟體平臺:               作業系統:Windows 7 64-bit

作業系統實驗python程式碼模擬實現生產者消費者模式

相比C/C++指標的折磨,本人更喜歡python程式碼的簡潔,廢話不多說: from multiprocessing import Process, JoinableQueue import time,

機器學習演算法推導簡單線性迴歸多元線性迴歸

線性迴歸,主要用於從資料中擬合出一條直線(或更高維的平面),這條直線能夠很好地體現資料的特徵,比如,它能夠使得平面上的點都均勻地分佈在這條直線上。 演算法思想 對於簡單線性迴歸和多元線性迴歸,其演算法過程是相同的,不同之處在於簡單線性迴歸只有一個特徵需要擬合,多元線

linux c簡單UDP應用,資料傳送接收

主要函式: 接收recvfrom()     ssize_t recvfrom (int sockfd, void *buf, size_t len, int flags, stru