博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)工厂方法模式
阅读量:6251 次
发布时间:2019-06-22

本文共 2033 字,大约阅读时间需要 6 分钟。

转自:http://www.jellythink.com/archives/62

问题描述

之前讲到了,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码。是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简单,如果工程大了,出错也是在所难免的!!!)。这种对代码的修改是最原始,最野蛮的修改,本质上不能称之为对代码的扩展。同时,由于对已经存在的函数进行了修改,那么以前进行过的测试,都将是无效的,所有的测试,都将需要重新进行,所有的代码都需要进行重新覆盖。这种,增加成本,不能提高效率的事情,在公司是绝对不允许的(除非昏庸的PM)。出于种种原因,简单工厂模式,在实际项目中使用的较少。那么该怎么办?怎么办呢?需要对原有代码影响降到最小,同时能对原有功能进行扩展。

UML类图

那么今天介绍的工厂方法模式,就隆重登场了。它只是对简单工厂模式的扩展,在GOF的介绍中,它们是合并在一起的,而我则是单独分开进行讲解的,就是为了区分二者的利弊,便于大家在实际项目中进行更好的把握与应用。工厂方法模式是在简单工厂模式的基础上,对“工厂”添加了一个抽象层。将工厂共同的动作抽象出来,作为抽象类,而具体的行为由子类本身去实现,让子类去决定生产什么样的产品。

如图,FactoryA专心负责生产ProductA,FactoryB专心负责生产ProductB,FactoryA和FactoryB之间没有关系;如果到了后期,如果需要生产ProductC时,我们则可以创建一个FactoryC工厂类,该类专心负责生产ProductC类产品。由于FactoryA、FactoryB和FactoryC之间没有关系,当加入FactoryC加入时,对FactoryA和FactoryB的工作没有产生任何影响,那么对代码进行测试时,只需要单独对FactoryC和ProductC进行单元测试,而FactoryA和FactoryB则不用进行测试,则可省去大量无趣无味的测试工作。

适用场合

工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

  1. 在设计的初期,就考虑到产品在后期会进行扩展的情况下,可以使用工厂方法模式;
  2. 产品结构较复杂的情况下,可以使用工厂方法模式;

由于使用设计模式是在详细设计时,就需要进行定夺的,所以,需要权衡多方面的因素,而不能为了使用设计模式而使用设计模式。

代码实现

/*** FileName     : FactoryMethodPatternDemo** Author       : Jelly Young** Date         : 2013/11/18** Description  : More information, please go to http://www.jellythink.com*/#include 
using namespace std; class Product { public: virtual void Show() = 0; }; class ProductA : public Product { public: void Show() { cout<< "I'm ProductA"<
CreateProduct(); productA->Show(); Factory *factoryB = new FactoryB (); Product *productB = factoryB->CreateProduct(); productB->Show(); if (factoryA != NULL) { delete factoryA; factoryA = NULL; } if (productA != NULL) { delete productA; productA = NULL; } if (factoryB != NULL) { delete factoryB; factoryB = NULL; } if (productB != NULL) { delete productB; productB = NULL; } return 0; }

2013年11月18日 于大连、东软。

转载于:https://www.cnblogs.com/buptlyn/p/4442233.html

你可能感兴趣的文章
eclipse中tomcat能正常启动,在浏览器中不能打开问题
查看>>
基于Linux根据僵尸网络病毒平台《比尔盖茨》
查看>>
JNI编程(二) —— 让C++和Java相互调用(2)
查看>>
Android搜索框效果
查看>>
ReportMachine OCX
查看>>
IOS开发--待研究源码(持续添加更新)
查看>>
解读ASP.NET 5 & MVC6系列(9):日志框架
查看>>
LinkedHashMap及其源码分析
查看>>
Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员
查看>>
环境配置
查看>>
codeforces 468B 2-sat
查看>>
php对uploads文件的处理问题的解决
查看>>
Python urllib简单使用
查看>>
Python - 001 - 类与实例间属性的理解
查看>>
C# 使用xenocode混淆加密【转】
查看>>
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结(转)
查看>>
JavaScript(ECMAScript) with 语句
查看>>
在小米工作是怎样一番体验?
查看>>
VS编译链接时错误(Error Link2005)的解决方法
查看>>
Oracle SQL Developer 连接 MySQL
查看>>