面向對象設計與分析40講(16)靜態工廠方法模式

前面我們介紹了簡單工廠模式,在創建對象前,我們需要先創建工廠,然后再通過工廠去創建產品。

如果將工廠的創建方法static化,那么無需創建工廠即可通過靜態方法直接調用的方式創建產品:

// 工廠類,定義了靜態工廠方法
class SimpleFactory {
public:static Product* createProduct(const string& type) {if (type == "A") {return new ConcreteProductA();} else if (type == "B") {return new ConcreteProductB();} else {return nullptr;}}
};

將工廠創建方法改成 static 的優缺點如下:

優點:

  1. 無需實例化工廠類:使用靜態工廠方法可以直接通過類名調用,無需創建工廠類的實例,簡化了代碼。
  2. 不依賴對象狀態:靜態工廠方法不依賴于對象的狀態,因此可以保持更好的純粹性和確定性。
  3. 提高代碼可讀性:靜態工廠方法可以直接通過類名調用,使得代碼更加清晰和直觀。

缺點:

  1. 不容易被子類繼承和修改:靜態方法在子類中不能被重寫,因此不太適合需要在子類中定制創建邏輯的場景。
  2. 難以進行單元測試:靜態方法難以進行單元測試,特別是在需要模擬對象行為的情況下。
  3. 違背開閉原則:靜態工廠方法難以支持新增產品類型的擴展,需要修改工廠類的代碼,違背了開閉原則。

總的來說,靜態工廠方法在某些情況下可以簡化代碼,提高可讀性,但也存在一些局限性,特別是在需要靈活擴展和可測試性方面表現不佳。在實際應用中,需要根據具體的場景和需求來選擇是否使用靜態工廠方法。

靜態工廠方法還可以直接集成到類中,簡稱self create。

class A {private:A() {} // 私有構造函數,確保不能通過外部代碼創建新實例public:static A* CreateInstance() {return new A(); // 創建新實例并返回指針}public:void DoSomething() {// 實現具體功能}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搜索詳解

搜索 一.dfs和bfs簡介 深度優先遍歷(dfs) 本質: 遍歷每一個點。 遍歷流程: 從起點開始,在其一條分支上一條路走到黑,走不通了就往回走,只要當前有分支就繼續往下走,直到將所有的點遍歷一遍。 剪枝&a…

Python外(5)-for-enumerate()-zip()

for循環小技巧技巧1:enumerate()技巧2:打包兩個可遍歷數據,一起循環-zip()技巧1:enumerate() 在使用pytorch訓練網絡的過程中,官方教程給出了 for i, data in enumerate(trainloader, 0): 這涉及到enumerate函數的使用…

特征工程總結

目錄1 特征工程是什么? 2 數據預處理   2.1 無量綱化     2.1.1 標準化     2.1.2 區間縮放法     2.1.3 標準化與歸一化的區別   2.2 對定量特征二值化   2.3 對定性特征啞編碼   2.4 缺失值計算   2.5 數據變換 3 特征選擇   3.1 Filter …

Jmeter測試并發https請求成功了

Jmeter2.4 如何測試多個并發https請求,終于成功了借此機會分享給大家 首先要安裝jmeter2.4版本的,而且不建議大家使用badboy,因為這存在兼容性問題。對于安裝,我就不講了,我就說說如何測試https,想必大家都…

關系數據庫——sql基礎1定義

關系數據庫標準語言SQL 基本概念 SQL語言是一個功能極強的關系數據庫語言。同時也是一種介于關系代數與關系演算之間的結構化查詢語言(Structured Query Language),其功能包括數據定義、數據查詢、數據操縱和數據控制。 SQL的特點&#xff…

libcurl編程

一、curl簡介 curl是一個利用URL語法在命令行方式下工作的文件傳輸工具。它支持的協議有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理服…

大數據學習(09)--Hadoop2.0介紹

文章目錄目錄1.Hadoop的發展與優化1.1 Hadoop1.0 的不足與局限1.2 Hadoop2.0 的改進與提升2.HDFS2.0 的新特性2.1 HDFS HA2.2 HDFS Federation3. 新一代的資源管理器YARN3.1 MapReduce1.0 缺陷3.2 YARN的設計思路3.3 YARN 體系結構3.4 YARN工作流程3.5 YARN框架與MapReduce1.0框…

Java多線程常用方法

start()與run() start() 啟動線程并執行相應的run()方法 run() 子線程要執行的代碼放入run()方法 getName()和setName() getName() 獲取此線程的名字 setName() 設置此線程的名字 isAlive() 是判斷當前線程是否處于活動狀態。活動狀態就是已經啟動尚未終止。 curren…

MachineLearning(2)-圖像分類常用數據集

圖像分類常用數據集1 CIFAR-102.MNIST3.STL_104.Imagenet5.L-Sun6.caltech-101在訓練神經網絡進行圖像識別分類時,常會用到一些通用的數據集合。利用這些數據集合可以對比不同模型的性能差異。下文整理常用的圖片數據集合(持續更新中)。基本信息對比表格…

Linux網絡編程實例詳解

本文介紹了在Linux環境下的socket編程常用函數用法及socket編程的一般規則和客戶/服務器模型的編程應注意的事項和常遇問題的解決方法,并舉了具體代 碼實例。要理解本文所談的技術問題需要讀者具有一定C語言的編程經驗和TCP/IP方面的基本知識。要實習本文的示例&…

python的命令解析getopt.getopt()函數分析

【轉自http://hi.baidu.com/javalang/blog/category/Python】 可以參考http://docs.python.org/lib/module-getopt.html # -*- coding: cp936 -*-import getoptimport sysdef usage():print Help Information:-h: Show help information-xValue:...if __name____main__:#set d…

博弈論基礎

博弈論總結 什么是博弈論: 多人進行博弈,假設每個人都采取最優策略,一定有一個人勝出,在知道初態及規則的情況下,求解出 何人勝出的一類問題的理論及方法。 博弈論的一些性質 P點:必敗點,N…

矩陣論-范數理論及其應用

范數理論及其應用2.1向量范數及其性質2.2矩陣范數本系列博文主要總結學習矩陣論的心得筆記,參考數目《矩陣論》–張凱院;整個文章的整理體系參照行書過程。范數–非負實數,用于衡量線性空間元素(如:向量,矩…

大數據學習(09)--spark學習

文章目錄目錄1.spark介紹1.1 spark介紹1.2 scale介紹1.3 spark和Hadoop比較2.spark生態系統3.spark運行框架3.1 基本概念3.2 架構的設計3.3 spark運行基本流程3.4 spark運行原理3.5 RDD運行原理3.5.1 設計背景3.5.2 RDD概念和特性3.5.3 RDD之間的依賴關系3.5.4 stage的劃分3.5.…

探索 Pexpect

概述 通過本系列第一部分 《探索 Pexpect,第 1 部分:剖析 Pexpect 》(請參閱參考資料)的介紹,相信大家已經對 Pexpect 的用法已經有了比較全面的了解,知道 Pexpect 是個純 Python 語言實現的模塊&#xff…

Python的Pexpect詳解 [圖片]

Pexpect 是一個用來啟動子程序并對其進行自動控制的純 Python 模塊。 Pexpect 可以用來和像 ssh、ftp、passwd、telnet 等命令行程序進行自動交互。繼第一部分《探索 Pexpect,第 1 部分:剖析 Pexpect 》介紹了 Pexpect 的基礎和如何使用后,本…

關系數據庫——sql增刪改

數據的插入 插入元祖 --1. 表名后沒有指定屬性列:表示要插入的是一條完整的元組,且屬性列屬性與表定義中的順序一致 insert into student values (201215128, 陳東, 18, 男, IS);--2. 在表明后指定要插入數據的表名及屬性列,屬性列的順序可…

機器學習中的聚類方法總結

聚類定義 定義 聚類就是對大量未知標注 的數據集,按數據 的內在相似性將數據集劃分為多個類別,使 類別內的數據相似度較大而類別間的數據相 似度較小。是無監督的分類方式。 聚類思想 給定一個有N個對象的數據集,構造數據的k 個簇&#x…

學點數學(1)-隨機變量函數變換

隨機變量函數變換本文介紹一維隨機變量函數變換,參考文獻:https://wenku.baidu.com/view/619f74ac3186bceb19e8bbd0.html變換TTT作用于隨機變量XXX,產生隨機變量YYY. T:X?>Y或者寫為yT(x)T:X->Y 或者寫為 yT(x)T:X?>Y或者寫為yT(x…

關系數據庫——關系數據語言

關系 域:一組具有相同數據類型的值的集合(即取值范圍) 笛卡爾積:域上的一種集合運算。結果為一個集合,集合的每一個元素是一個元組,元組的每一個分量來自不同的域。 基數:一個域允許的不同取值…