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.mzph.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;需要进…