工厂模式是将带有继承于基类的子类的创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类。

基于自己的理解和使用这里巩固一下工厂模式。

我们的项目目前使用最多的是简单工厂模式,不过其他两种模式:工厂模式和抽象工厂模式都是由简单工厂模式改进而来,

也很容易使用。

话不多说:见代码

一、简单工厂模式:

操作类: 接口类: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++ 三种工厂模式的更多相关文章

  1. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...

  2. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  3. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  4. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  5. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  6. java 三种工厂模式

    一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...

  7. 深入理解Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...

  8. Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...

  9. 设计模式—三种工厂模式(JAVA)

    一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...

随机推荐

  1. Dapper.NET使用(转)

    Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一 ...

  2. 向sqlserver插入二进制数据(比如图片)

    sqlserver插入二进制数据 偶然在sqlteam看到了,真是够绝,这都想得出来,很便捷的一个方式(只适用于SQL SERVER 2005+),代码如下: CREATE TABLE myTable ...

  3. CodeForces 602D 【单调队列】【简单数学】

    题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义 ...

  4. nyoj 91 阶乘之和

    点击打开链接 阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度: 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2 ...

  5. 蓝桥杯--- 历届试题 大臣的旅费 (DFS & Vector)

    题目提交链接:http://lx.lanqiao.org/problem.page?gpid=T32 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国 ...

  6. hitTest方法与PointInside方法

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. (转载)MonoBehaviour的事件和具体功能总结

    分享一点MonoBehaviour的事件和具体功能总结的基础知识,苦于Visual Studio 2013没有对MonoBehaviour的行为做出智能提示,写个函数都要全手打,记性好的将就着手打,脑 ...

  8. socket学习笔记——线程(聊天程序)

    server.c #include <stdio.h> #include <pthread.h> #include <semaphore.h> #include & ...

  9. js实现页面悬浮框

    当滚动条下拉时,悬浮框位置不变,主要是 position:fixed;样式的作用. 当下拉到一定程度,接近footer时,我用js控制div消失,往上拉滚动条时又显示. <!DOCTYPE ht ...

  10. Vim与GCC和gdb完美组合

    一.vim vim修改一下配置文件后,如果你稍微会点vim的命令使用,那可比一般的编辑器好用啊,如果一点不会vim的命令使用,就跟一般编辑器一样使用. 打开etc/vim/vimrc文件 这里的引号是 ...