• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 举例解析设计模式中的工厂方法模式在C++编程中的运用

举例解析设计模式中的工厂方法模式在C++编程中的运用

作者:runfeel 字体:[增加 减小] 来源:互联网 时间:2017-05-28

runfeel 通过本文主要向大家介绍了工厂方法模式,工厂方法模式实例,工厂方法模式java,工厂方法模式优缺点,工厂方法模式类图等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里。这样工厂父对象和产品父对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节。
其类图如下:

20163594444679.png (883×390)

实例代码为:

#pragma once 
class IProduct 
{ 
public: 
  IProduct(void); 
  virtual ~IProduct(void); 
}; 
 
#pragma once 
#include "iproduct.h" 
class IPad : 
  public IProduct 
{ 
public: 
  IPad(void); 
  ~IPad(void); 
}; 
 
#pragma once 
#include "iproduct.h" 
class IPhone : 
  public IProduct 
{ 
public: 
  IPhone(void); 
  ~IPhone(void); 
}; 


#pragma once 
#include"IProduct.h" 
 
class IFactory 
{ 
public: 
  IFactory(void); 
  virtual ~IFactory(void); 
 
  virtual IProduct* getProduct(); 
}; 
 
 
#pragma once 
#include "ifactory.h" 
class IPadFactory : 
  public IFactory 
{ 
public: 
  IPadFactory(void); 
  ~IPadFactory(void); 
 
  virtual IProduct* getProduct(); 
}; 
 
 
#pragma once 
#include "ifactory.h" 
class IPhoneFactory : 
  public IFactory 
{ 
public: 
  IPhoneFactory(void); 
  ~IPhoneFactory(void); 
 
  virtual IProduct* getProduct(); 
}; 

</div>

关键的实现:

#include "StdAfx.h" 
#include "IPadFactory.h" 
#include"IPad.h" 
 
IPadFactory::IPadFactory(void) 
{ 
} 
 
 
IPadFactory::~IPadFactory(void) 
{ 
} 
 
IProduct* IPadFactory::getProduct() 
{ 
  return new IPad(); 
} 
 
 
#include "StdAfx.h" 
#include "IPhoneFactory.h" 
#include"IPhone.h" 
 
IPhoneFactory::IPhoneFactory(void) 
{ 
} 
 
 
IPhoneFactory::~IPhoneFactory(void) 
{ 
} 
 
 
IProduct* IPhoneFactory::getProduct() 
{ 
  return new IPhone(); 
} 

</div>

调用方式:

#include "stdafx.h" 
#include"IFactory.h" 
#include"IPadFactory.h" 
#include"IPhoneFactory.h" 
#include"IProduct.h" 
 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
  IFactory *fac = new IPadFactory(); 
  IProduct *pro = fac->getProduct(); 
 
  fac = new IPhoneFactory(); 
  pro = fac->getProduct(); 
  return 0; 
} 

</div>


应用场景:
1..net里面的数据库连接对象就是产生数据命令对象的工厂。每种数据库的connection对象里(继承自IDbConnection)都有对自己createCommand(定义在IDbCommand里)的实现。
2..net里面的迭代器,IEnumerable定义了迭代器的接口,即工厂方法,每一个继承自IEnumerable的类都要实现GetEnumerator。可以参看ArrayList,String的GetEnumerator方法。他们都继承自IEnumerable。

对比简单工厂模式与工厂方法模式:

1. 结构复杂度

从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。

2.代码复杂度

代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。

3.客户端编程难度

工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。

4.管理上的难度

这是个关键的问题。

我 们先谈扩展。众所周知,工厂方法模式完全满足OCP,即它有非常良好的扩展性。那是否就说明了简单工厂模式就没有扩展性呢?答案是否定的。简单工厂模式同 样具备良好的扩展性——扩展的时候仅需要修改少量的代码(修改工厂类的代码)就可以满足扩展性的要求了。尽管这没有完全满足OCP,但笔者认为不需要太拘 泥于设计理论。

然后我们从维护性的角度分析下。假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时 需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式 仍然仅仅需要修改唯一的工厂类(无论怎样都能改到满足要求吧?大不了把这个类重写)。

由以上的分析,笔者认为简单工厂模式更好用更方便些。当然这只是笔者的个人看法而已,毕竟公认的,工厂方法模式比简单工厂模式更“先进”。但有时过于先进的东西未必适合自己,这个见仁见智吧。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 举例解析设计模式中的工厂方法模式在C++编程中的运用

相关文章

  • 2017-05-28C语言实现字符转unix时间戳的简单实例
  • 2017-05-28C++ const修饰变量和修饰函数介绍
  • 2017-05-28C语言实现清空指定文件夹中所有文件的方法
  • 2017-05-28Swift编程中的泛型解析
  • 2017-05-28用C语言判断一个二叉树是否为另一个的子结构
  • 2017-05-28C语言创建和操作单链表数据结构的实例教程
  • 2017-05-28C++中的类模板详解及示例
  • 2017-05-28弦图ZOJ 1015 Fishing Net 判定方法
  • 2017-05-28用C语言来实现一个简单的虚拟机
  • 2017-05-28理解C++编程中的std::function函数封装

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何在C++中通过模板去除强制转换
    • 浅析C++中cout的运行机制
    • Linux线程管理必备:解析互斥量与条件变量的详解
    • C++指向类成员函数的指针详细解析
    • 详解C语言的随机数生成及其相关题目
    • C++二维数组中的查找算法示例
    • 显示任何进程加载的DLL文件的代码
    • 解析C++中指向对象的指针使用
    • C++ 关于MFC List Control 控件的总结
    • 如何查看进程实际的内存占用情况详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有