C++ 三种工厂模式

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

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

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

也很容易使用。

话不多说:见代码

一、简单工厂模式:

操作类: 接口类:CReadDocumentShowHandler,三个具体类:CReadWordShowHandler,CReadPdfShowHandler,CReadHtmlShowHandler继承于CReadDocumentShowHandler

工厂类:CReadDocumentFactory 工厂类通过成员函数CReadDocumentShowHandler * CreateReadDocHandler( int type );

创建对象,type指定具体对对象的类型。

类图:

操作类代码:
  1 #pragma once
  2 #include <iostream>
  3
  4 class CReadDocumentShowHandler
  5 {
  6 public:
  7     CReadDocumentShowHandler();
  8     virtual ~CReadDocumentShowHandler();
  9 public:
 10     virtual bool ReadDocumentShow() = 0;
 11 };
 12
 13 typedef enum ReadType
 14 {
 15     WORD,
 16     HTML,
 17     PDF,
 18     UNKNOWN
 19 };
 20
 21 #pragma once
 22 #include "ReadDocumentShowHandler.h"
 23
 24 class CReadHtmlShowHandler :
 25     public CReadDocumentShowHandler
 26 {
 27 public:
 28     CReadHtmlShowHandler();
 29     virtual ~CReadHtmlShowHandler();
 30 public:
 31     virtual  bool ReadDocumentShow();
 32 };
 33 #pragma once
 34 #include "ReadDocumentShowHandler.h"
 35
 36 class CReadPdfShowHandler :
 37     public CReadDocumentShowHandler
 38 {
 39 public:
 40     CReadPdfShowHandler();
 41     virtual ~CReadPdfShowHandler();
 42 public:
 43     virtual  bool ReadDocumentShow();
 44 };
 45 #pragma once
 46 #include "ReadDocumentShowHandler.h"
 47
 48 class CReadWordShowHandler :
 49     public CReadDocumentShowHandler
 50 {
 51 public:
 52     CReadWordShowHandler();
 53     virtual ~CReadWordShowHandler();
 54 public:
 55     virtual  bool ReadDocumentShow();
 56 };
 57
 58 #include "ReadDocumentShowHandler.h"
 59
 60
 61 CReadDocumentShowHandler::CReadDocumentShowHandler()
 62 {
 63 }
 64
 65
 66 CReadDocumentShowHandler::~CReadDocumentShowHandler()
 67 {
 68 }
 69 #include "ReadHtmlShowHandler.h"
 70
 71
 72 CReadHtmlShowHandler::CReadHtmlShowHandler()
 73 {
 74 }
 75
 76
 77 CReadHtmlShowHandler::~CReadHtmlShowHandler()
 78 {
 79 }
 80
 81 bool CReadHtmlShowHandler::ReadDocumentShow()
 82 {
 83     try
 84     {
 85         //operation ...
 86         std::cout << " Read Html Document Operation ..." <<std::endl;
 87         return true;
 88     }
 89     catch (...)
 90     {
 91         return false;
 92     }
 93 }
 94 #include "ReadPdfShowHandler.h"
 95
 96
 97 CReadPdfShowHandler::CReadPdfShowHandler()
 98 {
 99 }
100
101
102 CReadPdfShowHandler::~CReadPdfShowHandler()
103 {
104 }
105
106 bool CReadPdfShowHandler::ReadDocumentShow()
107 {
108     try
109     {
110         std::cout << " Read PDF Document Operation ..." << std::endl;
111         return true;
112     }
113     catch (...)
114     {
115         return false;
116     }
117 }
118 #include "ReadWordShowHandler.h"
119
120
121 CReadWordShowHandler::CReadWordShowHandler()
122 {
123 }
124
125
126 CReadWordShowHandler::~CReadWordShowHandler()
127 {
128 }
129
130 bool CReadWordShowHandler::ReadDocumentShow()
131 {
132     try
133     {
134         std::cout << " Read Word Document Operation ..." << std::endl;
135         return true;
136     }
137     catch (...)
138     {
139         return false;
140     }
141 }
工厂类代码:
 1 #pragma once
 2 #include "ReadDocumentShowHandler.h"
 3 class CReadDocumentFactory
 4 {
 5 public:
 6     CReadDocumentFactory();
 7     virtual ~CReadDocumentFactory();
 8 public:
 9     CReadDocumentShowHandler * CreateReadDocHandler( int type );
10 };
11
12
13
14 #include "ReadDocumentFactory.h"
15 #include "ReadWordShowHandler.h"
16 #include "ReadPdfShowHandler.h"
17 #include "ReadHtmlShowHandler.h"
18
19 CReadDocumentFactory::CReadDocumentFactory()
20 {
21 }
22
23
24 CReadDocumentFactory::~CReadDocumentFactory()
25 {
26 }
27
28 CReadDocumentShowHandler * CReadDocumentFactory::CreateReadDocHandler(int type)
29 {
30     CReadDocumentShowHandler * pReadDocHandler = NULL;
31     switch (type)
32     {
33     case WORD:
34         pReadDocHandler = new CReadWordShowHandler();
35         break;
36     case HTML:
37         pReadDocHandler = new CReadHtmlShowHandler();
38         break;
39     case PDF:
40         pReadDocHandler = new CReadPdfShowHandler();
41         break;
42     default:
43         break;
44     }
45     return pReadDocHandler != NULL ? pReadDocHandler : NULL;
46 }

Client代码

 1 #include"ReadDocumentFactory.h"
 2 #include"ReadDocumentShowHandler.h"
 3 #include"ReadHtmlShowHandler.h"
 4 #include"ReadWordShowHandler.h"
 5 #include"ReadPdfShowHandler.h"
 6
 7
 8 int main()
 9 {
10     CReadDocumentFactory * pDocumentFactory = new CReadDocumentFactory();
11     CReadDocumentShowHandler * pRDShow = pDocumentFactory->CreateReadDocHandler(WORD);
12     pRDShow->ReadDocumentShow();
13     delete pRDShow;
14     pRDShow = NULL;
15     //
16     system("pause");
17     return 0;
18 }

二、工厂模式

工厂模式是对简单工厂模式的改进,由于之前的子类的创建都是根据type标识来创建不同的子类,所以如果子类增加,则必须在工厂创建方法中添加创建的type类型和子类类型,这违背了开放-封闭原则,所以我们,对不同的子类创建交由对应的子类工厂去创建,

即:把Switch Case分离,单独独立出CReadPdfFactory,CReadHtmlFactory,CReadWordFactory继承于CReadDocumentFactory,CReadDocumentFactory独立成接口类。

三、抽象工厂

抽象工厂是提供不同类型的类组成一个基本部件,比如一套衣服:有上衣和短裤,抽象工厂是一组类的组合创建的方式。

简单工厂和工厂模式都是指的是一类相同的类,抽象工厂是针对的不同类别的对象的组合,这点更复杂一点。所以在Factory的创建中会有创建一组对线的成员函数,ClassA * CreateClassA();Class B CreateClassB();具体的子类工厂去实现接口成员。

这里给出一个简单的类图:

时间: 2024-10-13 14:34:19

C++ 三种工厂模式的相关文章

设计模式看书笔记(5) - 三种工厂模式比较

先看三种工厂模式部分主要代码(完整代码在前三篇博客): 简单工厂模式: public class SampleFactory { public static Animal createAnimal(String animalName){ if("Tiger".equals(animalName))){ return new Triger(); }else if("Dolphin".equals(animalName)){ return new Dolphin();

设计模式:三种工厂模式

三种工厂模式 简单工厂实现 简单工厂模式(严格来说这不算一种Gof的设计模式,更像是一种编程习惯)属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类,应用继承将决定工厂的生产什么产品的决定权直接交到了客户手中,然后客户在输入自己的需求,得到最终的结果. 运用简单工厂模式实现生产pizza的业务场景. /// <summary> /// pizza创建工厂 /// </summary> public class Pi

高级特性 三种工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 我们从一个实例展开 现在有一道面试题:使用java实现一个计算机控制台程序,要求输入数的运算,得到结果. 这道题目最原始的写法: publi

三种工厂模式

一.简单工厂 对象的创建方式有很多,常用new来创建.但是这种做法在一些情况下,有很多不好的地方.比如创建操作散落在代码的多处.对象的创建职责和使用职责混合到一起等等.简单工厂可以一定程度上解决该问题.通常的做法是对被创建的多个类进行抽象,将公共成员和方法放到抽象类中.不同的类继承抽象类,对细节进行不同的实现.然后创建一个工厂类,将类实例化的操作封装到工厂类的静态工厂方法中,通过不同的参数来创建不同类的对象. 还有一种简化的做法是,将静态工厂方法放到实体类的公共抽象父类中. 优点: 对象的创建和

java三种工厂模式

适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 如果需要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化选择实现的过程.这种选择可以是明确进行的也可以是隐含的.前者如自行车那个例子,顾客可以选择需要的自行车型号:而下一节所讲的XHR工厂那个例子则属于后者,该例中所返回的连接对象的类型取决

三种工厂模式(转)

资源:http://download.csdn.net/detail/zhangerqing/4835830 原文链接:http://blog.csdn.net/zhangerqing 工厂模式分为三种:普通工厂方法模式,静态工厂模式,抽象工厂模式: 11.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: [java] view plaincopy public interface

java 三种工厂模式

一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ public abstract void desc(); } 先来一份兰州拉面(具体的产品类): public class LzNoodles extends INoodles { @Override public void desc() { System.out.println("兰州拉面 上海

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

一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 1 public interface Car { 2 String getName(); 3 } 奔驰类 1 public class Benz implements Car { 2 @Override 3 public String getName() { 4 return "Benz"; 5 } 6 } 宝马类 1 public c

Android 工厂模式,三种工厂模式的理解

工厂模式是一种创建者模式,在任何生成复杂对象的地方都可以使用工厂模式.理论来说在任何使用A a = new A()的方式都可以使用工厂模式,虽然使用工厂模式可能需要多做一些工作,但是在后续的开发和维护都带来了方便. 如果我们需要在构建对象的时候,需要做很多的处理工作,比如初始化工作,查询工作等一些耗时的工作,如果我们将这些操作全部放入到构造方法中去写,那么势必在后期维护的带来不方便,而且始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很