C++ 三种工厂模式
工厂模式是将带有继承于基类的子类的创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类。
基于自己的理解和使用这里巩固一下工厂模式。
我们的项目目前使用最多的是简单工厂模式,不过其他两种模式:工厂模式和抽象工厂模式都是由简单工厂模式改进而来,
也很容易使用。
话不多说:见代码
一、简单工厂模式:
操作类: 接口类:CReadDocumentShowHandler,三个具体类:CReadWordShowHandler,CReadPdfShowHandler,CReadHtmlShowHandler继承于CReadDocumentShowHandler
工厂类:CReadDocumentFactory 工厂类通过成员函数CReadDocumentShowHandler * CreateReadDocHandler( int type );
创建对象,type指定具体对对象的类型。
类图:

操作类代码:
#pragma once
#include <iostream> class CReadDocumentShowHandler
{
public:
CReadDocumentShowHandler();
virtual ~CReadDocumentShowHandler();
public:
virtual bool ReadDocumentShow() = ;
}; typedef enum ReadType
{
WORD,
HTML,
PDF,
UNKNOWN
}; #pragma once
#include "ReadDocumentShowHandler.h" class CReadHtmlShowHandler :
public CReadDocumentShowHandler
{
public:
CReadHtmlShowHandler();
virtual ~CReadHtmlShowHandler();
public:
virtual bool ReadDocumentShow();
};
#pragma once
#include "ReadDocumentShowHandler.h" class CReadPdfShowHandler :
public CReadDocumentShowHandler
{
public:
CReadPdfShowHandler();
virtual ~CReadPdfShowHandler();
public:
virtual bool ReadDocumentShow();
};
#pragma once
#include "ReadDocumentShowHandler.h" class CReadWordShowHandler :
public CReadDocumentShowHandler
{
public:
CReadWordShowHandler();
virtual ~CReadWordShowHandler();
public:
virtual bool ReadDocumentShow();
}; #include "ReadDocumentShowHandler.h" CReadDocumentShowHandler::CReadDocumentShowHandler()
{
} CReadDocumentShowHandler::~CReadDocumentShowHandler()
{
}
#include "ReadHtmlShowHandler.h" CReadHtmlShowHandler::CReadHtmlShowHandler()
{
} CReadHtmlShowHandler::~CReadHtmlShowHandler()
{
} bool CReadHtmlShowHandler::ReadDocumentShow()
{
try
{
//operation ...
std::cout << " Read Html Document Operation ..." <<std::endl;
return true;
}
catch (...)
{
return false;
}
}
#include "ReadPdfShowHandler.h" CReadPdfShowHandler::CReadPdfShowHandler()
{
} CReadPdfShowHandler::~CReadPdfShowHandler()
{
} bool CReadPdfShowHandler::ReadDocumentShow()
{
try
{
std::cout << " Read PDF Document Operation ..." << std::endl;
return true;
}
catch (...)
{
return false;
}
}
#include "ReadWordShowHandler.h" CReadWordShowHandler::CReadWordShowHandler()
{
} CReadWordShowHandler::~CReadWordShowHandler()
{
} bool CReadWordShowHandler::ReadDocumentShow()
{
try
{
std::cout << " Read Word Document Operation ..." << std::endl;
return true;
}
catch (...)
{
return false;
}
}
工厂类代码:
#pragma once
#include "ReadDocumentShowHandler.h"
class CReadDocumentFactory
{
public:
CReadDocumentFactory();
virtual ~CReadDocumentFactory();
public:
CReadDocumentShowHandler * CreateReadDocHandler( int type );
}; #include "ReadDocumentFactory.h"
#include "ReadWordShowHandler.h"
#include "ReadPdfShowHandler.h"
#include "ReadHtmlShowHandler.h" CReadDocumentFactory::CReadDocumentFactory()
{
} CReadDocumentFactory::~CReadDocumentFactory()
{
} CReadDocumentShowHandler * CReadDocumentFactory::CreateReadDocHandler(int type)
{
CReadDocumentShowHandler * pReadDocHandler = NULL;
switch (type)
{
case WORD:
pReadDocHandler = new CReadWordShowHandler();
break;
case HTML:
pReadDocHandler = new CReadHtmlShowHandler();
break;
case PDF:
pReadDocHandler = new CReadPdfShowHandler();
break;
default:
break;
}
return pReadDocHandler != NULL ? pReadDocHandler : NULL;
}
Client代码
#include"ReadDocumentFactory.h"
#include"ReadDocumentShowHandler.h"
#include"ReadHtmlShowHandler.h"
#include"ReadWordShowHandler.h"
#include"ReadPdfShowHandler.h" int main()
{
CReadDocumentFactory * pDocumentFactory = new CReadDocumentFactory();
CReadDocumentShowHandler * pRDShow = pDocumentFactory->CreateReadDocHandler(WORD);
pRDShow->ReadDocumentShow();
delete pRDShow;
pRDShow = NULL;
//
system("pause");
return ;
}
二、工厂模式
工厂模式是对简单工厂模式的改进,由于之前的子类的创建都是根据type标识来创建不同的子类,所以如果子类增加,则必须在工厂创建方法中添加创建的type类型和子类类型,这违背了开放-封闭原则,所以我们,对不同的子类创建交由对应的子类工厂去创建,
即:把Switch Case分离,单独独立出CReadPdfFactory,CReadHtmlFactory,CReadWordFactory继承于CReadDocumentFactory,CReadDocumentFactory独立成接口类。
三、抽象工厂
抽象工厂是提供不同类型的类组成一个基本部件,比如一套衣服:有上衣和短裤,抽象工厂是一组类的组合创建的方式。
简单工厂和工厂模式都是指的是一类相同的类,抽象工厂是针对的不同类别的对象的组合,这点更复杂一点。所以在Factory的创建中会有创建一组对线的成员函数,ClassA * CreateClassA();Class B CreateClassB();具体的子类工厂去实现接口成员。
这里给出一个简单的类图:

C++ 三种工厂模式的更多相关文章
- 三种工厂模式的分析以及C++实现
三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- java三种工厂模式
适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...
- java 三种工厂模式
一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...
- 深入理解Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...
- Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...
- 设计模式—三种工厂模式(JAVA)
一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...
随机推荐
- embed标签的使用(在网页中播放各种音频视频的插件的使用)
播放器插件使用说明: 代码:< EMBED src=“music.mid”autostart=“true”loop=“2”width=“80”height=“30”> src:音乐文件的路 ...
- Ubuntu下启动Apache的Rewrite功能
在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块. 另外,也可以通过将 /etc/apache2/mods-available/rewrite.l ...
- 20145305解佳玲 《Java程序设计》第1周学习总结
教材学习内容总结 第一章 Java平台概论 1.先了解了JAVA的历史 2.Java三大平台:Java SE.Java EE与Java ME 3.Java SE的四个组成部分:JVM.JRE.JDK与 ...
- android 定时执行一个任务
1. timer = new Timer(true) TimerTask task = new TimerTask(){ public void run(){ test(); } } timer.s ...
- SQL Server中GO的使用方法(转)
GO不是标准SQL语句,甚至不是T-SQL语句.它只是SQL Server管理器(SSMS)中用来提交T-SQL语句的一个标志.你可以在SSMS中任意指定这个提交标志.SSMS->工具-> ...
- angularjs ng-select ng-options 默认选中项.
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="utf- ...
- jQuery的jsonp跨域是这么回事.
实现跨域请求的有iframe,img,script中的src属性.那么jquery是如何解决跨域请求的呢? 一:项目jsonp2中有个app.js文件,代码如下: function app(json) ...
- sql server 2008 r2 中的oracle发布使用笔记
sql server 2008 r2 中的oracle发布功能,能够将oracle数据库作为发布服务器,将oracle中的数据自动同步到sql server 数据库中,在新建oracle发布前确保sq ...
- Chrome内嵌 FlashPlayer(PPAPI)会被页面DHTML元素遮住的问题
flash的wmode为window,Chrome版本为29.0.1547.66 m,Flash PPAPI为11.8.800.97,Flash NPAPI为11,8,800,94. flash在正常 ...
- Nginx 内置全局变量
Nginx在使用过程中,有不少的内置全局变量可以用做条件判断和编程控制,本文总结一些已知的指令,以供参考. $arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值. ...