(1)定义3

简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑。为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂,每一个工厂只生产特定的产品。

定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

(2)结构

工厂模式结构如下:

  • 抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法;
  • 具体工厂(ConcreteFactory):生产具体的产品;
  • 抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法;
  • 具体产品(ConcreteProduct):具体的产品类。

(3)实例

Factory.h

#ifndef FACTORY_H
#define FACTORY_H
#include <iostream>
#include <string> /********************************产品类***********************************/
//抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)
class AbstractSportProduct
{
public:
AbstractSportProduct(){}
~AbstractSportProduct(){} //虚函数
virtual void play(){}
}; //具体产品类Basketball
class Basketball :public AbstractSportProduct
{
public:
Basketball(){}
~Basketball(){} //具体实现方法
void play();
}; //具体产品类Football
class Football :public AbstractSportProduct
{
public:
Football(){}
~Football(){} //具体实现方法
void play();
}; /********************************工厂类***********************************/
//抽象工厂类
class AbstractFactory{
public:
//纯虚函数
virtual AbstractSportProduct *getSportProduct() = 0;
}; //具体工厂类BasketballFactory
class BasketballFactory:public AbstractFactory
{
public:
BasketballFactory(){}
~BasketballFactory(){} AbstractSportProduct *getSportProduct();
}; //具体工厂类FootballFactory
class FootballFactory:public AbstractFactory
{
public:
FootballFactory(){}
~FootballFactory(){} AbstractSportProduct *getSportProduct();
}; #endif // FACTORY_H

Factory.cpp

#include "Factory.h"

/********************************产品类方法***********************************/
//Basketball方法
void Basketball::play(){
printf("play Basketball\n");
} //Football方法
void Football::play(){
printf("play Football\n");
} /********************************工厂类方法***********************************/
//BasketballFactory方法
AbstractSportProduct *BasketballFactory::getSportProduct()
{
return new Basketball();
} //FootballFactory方法
AbstractSportProduct *FootballFactory::getSportProduct()
{
return new Football();
}

main.cpp

#include "Factory.h"

int _tmain(int argc, _TCHAR* argv[])
{
AbstractSportProduct *pro = nullptr;
AbstractFactory *fac = nullptr; fac = new BasketballFactory();
pro = fac->getSportProduct();
pro->play(); fac = new FootballFactory();
pro = fac->getSportProduct();
pro->play(); return 0;
}

输出结果:

(4)总结

如果想增加棒球(Baseball)类,只需要增加一个棒球工厂(BaseballFacory),然后在客户端代码中修改具体工厂类的类名,而原有的类的代码无需修改。由此可看到,相较简单工厂模式,工厂方法模式更加符合开闭原则。工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。

优点:

  • 工厂方法用于创建客户所需产品,同时向客户隐藏某个具体产品类将被实例化的细节,用户只需关心所需产品对应的工厂;
  • 工厂自主决定创建何种产品,并且创建过程封装在具体工厂对象内部,多态性设计是工厂方法模式的关键;
  • 新加入产品时,无需修改原有代码,增强了系统的可扩展性,符合开闭原则。

缺点:

  • 添加新产品时,需要同时添加新的产品工厂,系统中类的数量成对增加,增加了系统的复杂度,更多的类需要编译和运行,增加了系统的额外开销;
  • 工厂和产品都引入了抽象层,客户端代码中均使用的抽象层,增加了系统的抽象层次和理解难度。

【C++设计模式二】工厂模式的更多相关文章

  1. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  2. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  3. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  6. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  7. python设计模式之工厂模式

    一.理解工厂模式 在面向对象编程中,术语“工厂”表示一个负责创建替他类型对象的类.通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法.客户端使用某些参数调用此方法,之后,工厂会据此创建所需类 ...

  8. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

  9. C# 设计模式之工厂模式(一)

    写在前面,PS一句:笔记专用,轻拍勿喷,看的不爽绕路前行即可. 一.举栗说明 1.剧情:某银行财务有三位员工,分别为A.B.C三人,主要任务就是去银行取钱,如下: class EmloyeeA: { ...

  10. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. JVM学习第三天(JVM的执行子系统)之类加载机制补充

    昨晚没看完,今天继续 系统的类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.这句话可以表达得更通俗一些: ...

  2. 斗篷指令、属性指令、表单指令、条件指令、循环指令、js的Array操作、前台数据库、

    ```python"""1)指令 属性指令:v-bind 表达指令:v-model 条件指令:v-show v-if 循环指令:v-for 斗篷指令:v-cloak 2) ...

  3. Count(*) 与 count(field) 一样吗?

    有这么个表: 执行 select count(*) from hy_test select count(deptno) from hy_test 都得到 5 但执行 select count(name ...

  4. 重学Ajax

    什么是Ajax Asynchronous JavaScript and xml 异步的JavaScript和XML 只是一种js的应用,在无需重新加载整个网页的情况下实现部分网页的数据更新的技术.减少 ...

  5. Robotframework自动化1-Windows环境搭建

    前言: robotframework环境搭建-环境准备 1.python2,pip2 2.WxPython 3.Robot Framework 4.Robotframework-ride 5.RIDE ...

  6. 解决ExcelReport导出Excel报Number of rules must not exceed 3错误的问题

    报错信息: Number of rules must not exceed 3 [ArgumentException: Number of rules must not exceed 3] NPOI. ...

  7. matlab数据插值

    由图可见采样点前段比较稀疏,比较有规律,后段比较密集,比较复杂 这里的spline是三次样条插值 随着次数的增高,曲线在两端震荡的越来越剧烈 用上其他插值的方法 线性插值 最近点插值 分段三次米勒插值 ...

  8. 一文搞懂Cookie,Session,Token,JWT

    HTTP协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息.这样一些交互业务就无法支撑了.Cookie应运而生. Cookie 通过F12开发者工具,先瞅瞅Cookie的颜值 从图中 ...

  9. Eclipse安装AmaterasUML插件问题

    为了画UML图,我想在Eclipse(版本Version: Oxygen Release (4.7.0))安装AmaterasUML,第一步,安装GEF - http://download.eclip ...

  10. 刷题[GWCTF 2019]mypassword

    解题思路 打开网站,登陆框.注册一个用户后再登陆 看样子是注入了,在feedback.php中发现注释 <!-- if(is_array($feedback)){ echo "< ...