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)
一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...
随机推荐
- mysqldump 数据库迁移并改换engine
1. 导出数据库 mysqldump -h172.18.165.xxx -P3306 -uroot -pxxx --add-drop-database --default-character-set= ...
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语 ...
- 使用python + tornado 做项目demo演示模板
很简单,可是却也折腾了不是时间,走了不少弯路.在此备注记录一下,以供后需. # web_server.py #!/usr/bin/env python # coding=utf-8 import os ...
- Zabbix监控mysql配置及故障告警配置
本文主要介绍zabbix监控mysql的配置,包含使用zabbix自带模板监控mysql相关信息及自定义key监控mysql同步情况.同时介绍了触发器的创建及zabbix通过邮件方式告警配置. 一.配 ...
- [ActionScript 3.0] AS3 绘制正二十面体(线条)
分析: 正二十面体共有12个顶点.30条棱,其20个面都是正三角形.每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得.正二十 ...
- [Java] cmd命令行如何切换目录
cmd.exe是微软Windows系统基于WINDOWS上的命令解释程序,类似于微软的DOS操作系统.cmd.exe是一个32位的命令行程序,运行在Windows NT/2000/XP/2003/vi ...
- 一机运行多个resin的配置
对于java应用服务器,常用的一般为tomcat.jboss.resin. 一. 概述 经常会有这种情况: 1.一台服务器上,跑多个java应用 2.网站负载高,需要采用负载均衡(轮询)的方式来解决 ...
- [HDU 2546]饭卡 (动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 题意:见题目 刚开始怎么写都写不对,后来吃饭的时候想了想记忆化搜索的办法 就是说设dp(now, ...
- python3 内置函数 filter()
filter(function or None, iterable) --> filter object Return an iterator yielding those items of i ...
- python 字典实现类似c的switch case
#python 字典实现类似c的switch def print_hi(): print('hi') def print_hello(): print('hello') def print_goodb ...