C++設計模式之工廠模式(下)——抽象工廠模式

抽象工廠模式

  • 介紹
  • 示例
  • 示例使用
  • 運行結果
  • 抽象工廠模式的優缺點
    • 優點
    • 缺點
  • 總結

介紹

抽象工廠模式是一種創建型設計模式,它提供了一種封裝一組相關或相互依賴對象的方式,而無需指定它們具體的類。它允許客戶端使用抽象接口來創建一系列相關的對象,而不必關心其實際的實現細節。

在抽象工廠模式中,存在一個抽象工廠類,該類定義了一組創建對象的方法,這些方法可以創建一系列相關的對象,包括產品對象和工廠對象。由于這些對象都是通過一個抽象接口來創建的,因此它們的具體實現可以被隱藏在實際工廠類的后面。客戶端只需要使用抽象工廠類來創建對象,而無需關心它們的實際實現。(理解這個很重要,就是多態的應用)

通過使用抽象工廠模式,我們可以實現高層模塊的隔離和解耦,從而使系統更加靈活和可擴展。它還具有高度的封裝性,可以隱藏底層實現細節,提高系統的安全性和穩定性。但是它的缺點是增加了系統的復雜性,需要定義更多的抽象類和接口,會增加系統的開發和維護的難度。

示例

這里依舊在之前兩篇工廠模式的基礎之上,進行改進。
這里客戶需要工廠生產塑料的筆筒和鐵制筆筒,另外還想生產塑料劍和鐵制的劍。
下面是示例代碼:

class Sword //劍
{
public:virtual void play() = 0;
};class PlasticSword :public Sword //塑料劍
{
public:void play()override {cout << "塑料劍舞動!!" << endl;}
};class IronSword :public Sword //鐵制劍
{
public:void play()override {cout << "鐵制劍舞動!!" << endl;}
};class AbstractFactory 
{
public:virtual PenHolder* createPenHolder() = 0;virtual Sword* createSword() = 0;
};class ProductPlasticFactory :public AbstractFactory 
{
public:PenHolder *createPenHolder()override {return new PlasticPenHolder;}Sword* createSword()override {return new PlasticSword;}
};class ProductIronFactory :public AbstractFactory 
{
public:PenHolder* createPenHolder()override {return new IronPenHolder;}Sword* createSword()override {return new IronSword;}
};

示例使用

int main() 
{AbstractFactory *factory1 = new ProductPlasticFactory;PenHolder*pen_Holder1= factory1->createPenHolder();Sword* sword1 =  factory1->createSword();pen_Holder1->introduce();sword1->play();delete factory1;delete pen_Holder1;delete sword1;AbstractFactory *factory2 = new ProductIronFactory;PenHolder* pen_Holder2 = factory2->createPenHolder();Sword* sword2 = factory2->createSword();pen_Holder2->introduce();sword2->play();delete factory2;delete pen_Holder2;delete sword2;return 0;
}

運行結果

在這里插入圖片描述

抽象工廠模式的優缺點

優點

1.分離接口和實現:客戶端代碼只需要使用抽象工廠和抽象產品,不需要關注具體實現,降低了客戶端與具體實現的耦合度,提高了代碼的可維護性和可擴展性。

2.符合開閉原則:通過增加具體工廠和具體產品的實現,可以增加新的功能和新的產品,而不需要修改代碼。(這里只是針對現有的產品種類而言,隨著新產品的增加,需要修改抽象工廠的接口,繼而也需要修改子工廠的接口,這樣就破壞了開放封閉原則。)

3.保持一致性:抽象工廠模式可以保證一組產品的一致性,使得它們在邏輯上或者物理上都相互配合,滿足一定的約束條件。

缺點

1.增加復雜度:引入抽象工廠和多個抽象產品的層次結構,增加了系統的復雜度,增加了開發難度。

2.不易擴展:一旦增加了一個新的產品族,就需要修改抽象工廠和所有的具體工廠和產品,對系統的維護和擴展帶來了一定的困難。

3.限制產品族內的產品等級結構:由于抽象工廠只定義了一組產品的創建接口,因此它限制了具體產品等級結構的擴展,只能在產品族內擴展產品。

總結

抽象工廠設計模式確實很抽象,所以需要慢慢領悟,多悟幾次,然后再后期的開發中就可以融進自己的項目中,提高程序的封裝性,安全性,但復雜性也隨之增加。

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

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

相關文章

Jquery ajax 同步阻塞引起的UI線程阻塞的坑(loading圖片顯示不出來 )

Jquery ajax 同步阻塞引起的UI線程阻塞的坑&#xff08;loading圖片顯示不出來&#xff0c;layer.load延遲&#xff09;jax重新獲取數據刷新頁面功能&#xff0c;因為ajax屬于耗時操作&#xff0c;想在獲取數據且加載頁面時顯示加載遮罩層&#xff0c;結果發現了ajax的好多坑。…

Elasticsearch自動清理腳本

腳本 我在data下創建的腳本文件就叫:vi /data/clear_log.sh,內容如下 #!/bin/sh #獲取時間 time=`date +%Y-%m-%d %H:%M:%S` cipan=`df -h| grep sda3` #查詢磁盤使用率 liang=`df -h| grep sda3 |grep -v grep |awk {print $5}|tr -d

【數據結構】一題帶你出師鏈表!

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:數據結構 ??操作環境:Visual Studio 2022 題目鏈接 138. 隨機鏈表的復制https://leetcode.cn/problems/copy-list-with-random-pointer/ 題目描述 給你一個長度為 n 的鏈表&#xff0c;每個節點包含一個額外增加的隨機…

Make a BESD file from QTLtools output

Make a BESD file from QTLtools output # 根據基因名與變異rsid編號去重 library(tidyverse) library(readxl) qtltoolsnomi <- read_table("qtltoolsnomi.txt",col_names F) qtltoolsnomi %>% distinct(X1,X8, .keep_all TRUE) -> qtltool qtltool …

qml ParticleSystem3D使用介紹

在 Qt Quick 3D 中,ParticleSystem3D 是用來創建和控制3D粒子系統的元素。粒子系統是圖形編程中用于模擬液體、煙霧、火、星空等現象的技術,它通過生成大量小粒子來模擬這些效果。ParticleSystem3D 提供了一個框架,允許開發者定義粒子的各種屬性,如生命周期、速度、顏色、大…

王道p149 9.設樹B是一棵采用鏈式結構存儲的二叉樹,編寫一個把樹 B中所有結點的左、右子樹進行交換的函數。(c語言代碼實現)

本題代碼如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整測試代碼 #include<stdio.h> #include<stdlib.h> typed…

C#string.Format的一些使用

C#中的string.Format方法是一個用于格式化字符串的功能強大的方法。它允許您通過將占位符替換為實際的值來創建格式化的字符串。 一、基本語法是&#xff1a; string.Format(format, arg0, arg1, arg2, ...) 其中&#xff0c; format是一個字符串&#xff0c;其中包含要格式…

Java常用類

目錄 包裝類 裝箱和拆箱 包裝類型和String的轉換&#xff0c;包裝類的常用方法 包裝類 裝箱和拆箱 package com.edu.wrapper;public class Interger01 {//演示int<-->Integer的裝箱和拆箱//手動裝箱int n1100;Integer integer new Integer(n1);Integer integer01 In…

HCIP---MPLS---LDP

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 前言 MPLS 基于標簽轉發表進行轉發&#xff0c;與路由表類似&#xff0c;標簽轉發表有兩種獲取渠道&#xff1a;一是手動配置(類似靜態路由)&#xff0c;二是通過協議自動學習(類似OSPF)。手動配…

6.1.webrc媒體協商

那今天呢&#xff1f;我們來看一下y8 rtc的媒體協商&#xff0c;那實際上在我們之前的課程中呢&#xff1f;我已經向你介紹過y8 rtc的媒體協商了。只不過呢&#xff0c;角度是不一樣的&#xff0c;在之前介紹外邊tc媒體協商的時候呢&#xff0c;我們是從應用的角度來看。那web …

ActiveMQ消息中間件應用場景

一、ActiveMQ簡介 ActiveMQ是Apache出品&#xff0c;最流行的&#xff0c;能力強勁的開源消息總線。ActiveMQ是一個完全支持JMS1.1和J2EE1.4規范的JMS Provide實現。盡管JMS規范出臺已經是很久的事情了&#xff0c;但是JMS在當今的J2EE應用中仍然扮演這特殊的地位。 二、Active…

《第一行代碼:Android》第三版-2.5.4數據類與單例_數據類

本文主要講述數據類&#xff0c;以前用java實現數據類很麻煩&#xff0c;寫很多代碼&#xff0c;就是搭個數據類的框架。kotlin用data class 關鍵字&#xff0c;給你簡化了數據類的創建&#xff0c;比較貼心。 就是自動為你創建了&#xff1a;equals()、hashCode()、toString(…

深入理解JVM 類加載機制

深入理解JVM 類加載機制 虛擬機如何加載Class文件&#xff1f; Class文件中的信息進入到虛擬機后會發生什么變化&#xff1f; 類加載機制就是Java虛擬機把描述類的數據從Class文件加載到內存&#xff0c;并對數據進行校驗、轉換解析和初始化&#xff0c;最終形成可以被虛擬機…

實現點擊一個選框 使得一個組件的可選性修改

實現效果 代碼 html <div class"divrow"><el-checkbox-group v-model"isSendTag" :max"1"><el-checkbox v-for"(item, index) in isSendTagOptions" :key"index" :label"item.value">{{item.…

【C++設計模式】單例模式singleton

C 設計模式–單例模式singleton 單例模式 單例模式是指確保一個類在任何情況下都絕對只有一個實例&#xff0c;并提供一個全局訪問點。 優點&#xff1a;內存中只有一個實例&#xff0c;減少內存開銷&#xff1b;避免對資源多重占用&#xff1b;設置全局訪問點&#xff0c;嚴…

【Axure教程】用中繼器制作卡片多條件搜索效果

卡片設計通過提供清晰的信息結構、可視化吸引力、易擴展性和強大的交互性&#xff0c;為用戶界面設計帶來了許多優勢&#xff0c;使得用戶能夠更輕松地瀏覽、理解和互動。 那今天就教大家如何用中繼器制作卡片的模板&#xff0c;以及完成多條件搜索的效果&#xff0c;我們會以…

并發與并行

并發和并行是操作系統中的兩個重要概念&#xff0c;它們在定義和處理任務的方式上有一些區別。 并發&#xff08;concurrency&#xff09;是指在一段時間內&#xff0c;有多個程序都處于啟動運行到運行完畢之間&#xff0c;但任一時刻點上只有一個程序在處理機上運行。它是一種…

Vue偵聽器

Vue偵聽器是根據組件狀態做DOM更新或者異步更新其他級聯狀態的。計算屬性的主要目標是根據已有數據計算出組件的狀態&#xff0c;它是組件內部的計算&#xff0c;計算結果在組件內部應用。偵聽器的主要目標是根據組件狀態的變動&#xff0c;做級聯的或者異步的操作或DOM更新&am…

STM32F103C8T6第6天:adc、iic、spi、溫濕度dht11在lcd1602顯示

1. ADC介紹 ADC是什么&#xff1f; Analog-to-Digital Converter&#xff0c;指模擬/數字轉換器 ADC的性能指標 量程&#xff1a;能測量的電壓范圍分辨率&#xff1a;ADC能辨別的最小模擬量&#xff0c;通常以輸出二進制數的位數表示&#xff0c;比如&#xff1a;8、10、1…

【Spring篇】Spring注解式開發

本文根據嗶哩嗶哩課程內容結合自己自學所得&#xff0c;用于自己復習&#xff0c;如有錯誤歡迎指正&#xff1b; 我在想用一句話激勵我自己努力學習&#xff0c;卻想不出來什么驚為天人、精妙絕倫的句子&#xff0c;腦子里全是上課老師想說卻沒想起的四個字 “ 唯手熟爾 ”&am…