C++設計模式之Abstract Factory模式

一、功能
  提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

二、結構圖

  類廠最基本的結構示意圖如下:

2011010918040117.png

???


  在實際應用中,類廠模式可以擴充到很復雜的情況,如下圖所示:

2011010918044468.png

三、優缺點

  優點:(1)封裝創建過程。客戶不用知道類廠是如何創建類實例的,類廠封閉了所有創建的細節。這樣可選擇不同的創建方法,增加了靈活性。?

?? ? ? ? ?(2)將客戶與具體類隔離,提高了各自的可重用性。?

  缺點:Factory類層次與具體類層次通常是平行的(即一一對應的)。增加一個具體類,一般也要相應地增加一個factory類,增加了系統復雜度。

?

四、實現

  (1)Abstract Factory類中通常是一組Factory Method的集合。個人認為與Factory Method模式沒有本質區別。?

?

  (2)通常可以把工廠作為單件。

五、示例代碼

namespace DesignPattern_AbstractFactory
{

class AbstractProductA { }; // Product A
class ProductA1 : public AbstractProductA { };
class ProductA2 : public AbstractProductA { };

class AbstractProductB { }; // Product B
class ProductB1 : public AbstractProductB { };
class ProductB2 : public AbstractProductB { };

class AbstractFactory {
public:
virtual AbstractProductA* CreateProductA() = 0 ;// 創建ProductA
virtual AbstractProductB* CreateProductB() = 0 ;// 創建ProductB
} ;
 
class ConcreteFactory1 : public AbstractFactory {
public:
virtual AbstractProductA* CreateProductA() { return new ProductA1(); }
virtual AbstractProductB* CreateProductB() { return new ProductB1(); }
static ConcreteFactory1* Instance() { static ConcreteFactory1 instance ; return &instance; }   
protected:
ConcreteFactory1() { }
private:
ConcreteFactory1(
const ConcreteFactory1&);
ConcreteFactory1
& operator=(const ConcreteFactory1&);
};

class ConcreteFactory2 : public AbstractFactory {
public:
virtual AbstractProductA* CreateProductA() { return new ProductA2(); }
virtual AbstractProductB* CreateProductB() { return new ProductB2(); }
static ConcreteFactory2* Instance() { static ConcreteFactory2 instance; return &instance; }
protected:
ConcreteFactory2() { }
private:
ConcreteFactory2(
const ConcreteFactory2&);
ConcreteFactory2
& operator=(const ConcreteFactory2&);
} ;
}

//客戶端代碼:
{
using namespace DesignPattern_AbstractFactory ;
// 第一種創建方法
AbstractFactory *pFactory = ConcreteFactory1::Instance() ;
AbstractProductA
*pProductA = pFactory->CreateProductA() ;
AbstractProductB
*pProductB = pFactory->CreateProductB() ;

// 第二種創建方法
pFactory = ConcreteFactory2::Instance() ;
pProductA
= pFactory->CreateProductA() ;
pProductB
= pFactory->CreateProductB() ;
}

?


?

六、實例

  最早知道類廠的概念是在COM中,但當時也沒想到這是如此重要的一種模式,在許多其他模式中都可以用到類廠模式。 COM中不能直接創建組件,這也是由COM的一個特性決定的:即客戶不知道要創建的組件的類名。

轉載于:https://www.cnblogs.com/chain2012/archive/2011/01/09/1931363.html

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

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

相關文章

數字圖像處理小練習存檔1

小練習的題目: 1、讀取一張圖,分解RGB三個通道 /************練習1**********************/ int main() {Mat img1 imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度圖if (img1.empty()){printf("Could not find the imag…

UIImage 壓縮

1.改變圖片大小 -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize {// Create a graphics image contextUIGraphicsBeginImageContext(newSize);// Tell the old image to draw in this new context, with the desired// new size[image drawInRect:CG…

06-對圖像進行腐蝕操作

形態學中的腐蝕操作一般處理的圖像數據為二值的 cv2.erode(img,kernel,iterations 1) kernel表示拿多大的卷積核去腐蝕 iterations表示迭代次數 可以將一些帶有毛毛的圖像去毛毛化 原圖 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)…

Java BufferedReader skip()方法與示例

BufferedReader類skip()方法 (BufferedReader Class skip() method) skip() method is available in java.io package. skip()方法在java.io包中可用。 skip() method is used to skip the given number of bytes of characters (n_bytes_of_char) from this BufferedReader. s…

mysql gtid binlog_MySQL之-四步實現BinLog Replication升級為GTIDs Replication的代碼實例

1、將Master和Slave服務器都設置為read-onlymysql>SET global.read_onlyON;2、將Master與Slave服務器都停下來service mysql stop3、開啟GTIDs開啟GTIDs需要在master和slave服務器上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(在MySQL 5.6.9之前是…

【記】瑣碎

1.GIF載入問題:http://www.cnblogs.com/Lewis/archive/2011/01/17/1937066.html 2.正則分段數字: "12345678945612456".replace(new RegExp((\\d)(?(\\d{3})$),ig),"$1,") 其中用到了正則的后則判斷? 3.給legend設定寬度 發現IE下可以 火狐下…

spring對事務的控制 AOP

我解釋一下(* com.evan.crm.service.*.*(..))中幾個通配符的含義: |第一個 * —— 通配 任意返回值類型| |第二個 * —— 通配 包com.evan.crm.service下的任意class| |第三個 * —— 通配 包com.evan.crm.service下的任意class的任意方法| |第四個 .. —— 通配 方…

Opencv實現利用滑動條來調整閾值

#include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std; #define WINDOW_NAME "【程序窗口】" //為窗口標題定義的宏 //*--------------------------【練習】利用滑動條來調整閾值-----------------------------…

07-對圖像進行膨脹操作

形態學中的膨脹操作即讓照片變得更大&#xff0c;與腐蝕操作互為逆運算 cv2.dilate(erosion,kernel,iterations 1) 第一個參數&#xff1a;圖像對象名稱 第二個參數&#xff1a;卷積核的大小 第三個參數&#xff1a;迭代次數 此時就可與腐蝕操作進行相結合&#xff0c;腐蝕去毛…

Java LocalDate類| parse()方法與示例

LocalDate類parse()方法 (LocalDate Class parse() method) Syntax: 句法&#xff1a; public static LocalDate parse(CharSequence c_seq);public static LocalDate parse(CharSequence c_seq, DateTimeFormatter fmtr);parse() method is available in java.time package. …

Xhtml學習筆記

1. XHTML 是什么&#xff1f; XHTML 指可擴展超文本標簽語言&#xff08;EXtensible HyperText Markup Language&#xff09;。 XHTML 的目標是取代 HTML。 XHTML 與 HTML 4.01 幾乎是相同的。 XHTML 是更嚴格更純凈的 HTML 版本。 XHTML 是作為一種 XML 應用被重新定義的 HTML…

08-開運算和閉運算

開運算和閉運算實則就是將腐蝕操作和膨脹操作結合而已&#xff0c;也就是個先后循序罷了 開運算&#xff1a;先腐蝕再膨脹 閉運算&#xff1a;先膨脹再腐蝕 cv2.morphologyEx(img_open,cv2.MORPH_OPEN,kernel) cv2.morphologyEx(img_close,cv2.MORPH_CLOSE,kernel) 第一個參數…

連通域標記——實現硬幣自動計件

前言 在自動計算圖像中有幾枚硬幣的任務中&#xff0c;分離出前景和背景后是否就可以馬上實現自動計件&#xff0c;如果可以&#xff0c;如何實現&#xff1f;如果不可以&#xff0c;為什么&#xff1f; 答案是否定的。二值化之后我們的得到的只是前景總像素的多少&#xff0c…

Storm資料匯總

一、Storm集群安裝部署 網上關于storm集群部署都大同小異。 Storm下載地址&#xff1a;http://storm-project.net Storm項目地址&#xff1a;https://github.com/nathanmarz/storm 目前的版本不支持ZooKeeper3.4.5版本&#xff0c;而支持ZooKeeper3.3.3版本。 我當時沒注意這…

getlong_Java即時類| 帶示例的getLong()方法

getlong即時類getLong()方法 (Instant Class getLong() method) getLong() method is available in java.time package. getLong()方法在java.time包中可用。 getLong() method is used to get the value as long for the given temporal field from this Instant. getLong()方…

python作品闡述_Python網絡編程基礎的作品鑒賞-

Python網絡編程基礎的作品鑒賞Python網絡編佳入門圖書&#xff01;175個完整&#xff0c;實踐出真知&#xff0c;SocketsDNS、Web Service、FTP、Email、SMTP、POP、IMAP、SocketServe、CGI、XML、Forking、數據庫客戶端、多線程、異步通信……完整涵蓋網絡編程的方方面面“這可…

09-梯度運算

梯度運算膨脹操作-腐蝕操作&#xff0c;這里的-操作是圖像的減法&#xff0c;可不是簡單的加減乘除運算 為了更加形象生動&#xff0c;先將膨脹和腐蝕操作的結果進行合并展示&#xff0c;然后再與梯度運算進行比較 cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel) 第一個參數…

JavaScript學習筆記-我的淺顯認識

一&#xff1a;什么是javascript? 它是一種基于對象和事件驅動的解釋性的安全的與平臺無關的免費的瀏覽器腳本語言。 二&#xff1a;有什么用途&#xff1f; 使表單的驗證放在客戶端&#xff0c;更快捷反應&#xff0c;增強網頁的交互性。設計一些特效&#xff0c;如菜單&…

典型瀑布模型四個階段_古典瀑布模型的不同階段

典型瀑布模型四個階段The different phases that are included in the classical waterfall model are: 經典瀑布模型包含的不同階段是&#xff1a; Feasibility study 可行性研究 Requirement analysis and specification 需求分析和規范 Design 設計 Coding and unit testin…

Unity-Shader-渲染隊列

Unity-Shader-渲染隊列 渲染簡介Unity中的幾種渲染隊列Background (1000)最早被渲染的物體的隊列。Geometry (2000) 不透明物體的渲染隊列。大多數物體都應該使用該隊列進行渲染&#xff0c;也就是Unity Shader中默認的渲染隊列。AlphaTest (2450) 有透明通道&#xff0c;需要進…