工厂方法的意图

工厂方法主要用来创建对象,但是,具体创建什么对象,由子类来实现,父类只是封装一个虚创建对象的方法

抽象工厂的好处是在接口类中绕开的new的使用,避免因为需求变化而频繁的修改接口类,提高接口类的可复用性和可扩展性(易于维护),从而降低接口类对变化的依赖

举例

我们在做文档时,有时需要用Word,有时需要做PPT,还有时用Excel,所以,当我们创建不同类型的文件时,需要new不同的文档对象,这时,为了在不在接口或者基类中频繁修改new的对象,就可以使用工厂方法设计模式

代码如下

头文件

products.h

#ifndef PRODUCTSHEADFILE
#define PRODUCTSHEADFILE#include <iostream>
#include <cassert>using namespace std;class fileinstance//产品接口(基类)
{
public:fileinstance() {cout<<__func__<<endl;}virtual ~fileinstance(){cout<<__func__<<endl;}virtual void file()=0;
};class word:public fileinstance//具体的产品
{
public:word(){cout<<__func__<<endl;}~word(){cout<<__func__<<endl;}virtual void file();
};class ppt:public fileinstance//具体的产品
{
public:ppt(){cout<<__func__<<endl;}~ppt(){cout<<__func__<<endl;}virtual void file();
};class excel:public fileinstance//具体的产品
{
public:excel(){cout<<__func__<<endl;}~excel(){cout<<__func__<<endl;}virtual void file();
};#endif

factorymethod.h

#ifndef FACTORYHEADFILE
#define FACTORYHEADFILE#include "products.h"class creatfilefactory//工厂接口(基类)
{
public:creatfilefactory(){cout<<__func__<<endl;}virtual ~creatfilefactory(){cout<<__func__<<endl;}virtual fileinstance *creatfile()=0;//创建产品对象,返回抽象产品对象的指针,在子类中实现
};class wordfactory:public creatfilefactory//具体文件的工厂
{
public:wordfactory(){cout<<__func__<<endl;}~wordfactory(){cout<<__func__<<endl;}virtual fileinstance *creatfile();
};class pptfactory:public creatfilefactory//具体文件的工厂
{
public:pptfactory(){cout<<__func__<<endl;}~pptfactory(){cout<<__func__<<endl;}virtual fileinstance *creatfile();
};class excelfactory:public creatfilefactory//具体文件的工厂
{
public:excelfactory(){cout<<__func__<<endl;}~excelfactory(){cout<<__func__<<endl;}virtual fileinstance *creatfile();
};#endif

run.h

#ifndef RUNHEADFILE
#define RUNHEADFILE#include "factorymethod.h"class run
{
public:run(creatfilefactory *factory);//接受具体工厂的指针参数~run();void startrun();private:creatfilefactory *m_factory;
};#endif

源文件

products.cpp

products.cpp
#include "products.h"void word::file()
{cout<<"word will be created"<<endl;
}void ppt::file()
{cout<<"ppt will be created"<<endl;
}void excel::file()
{cout<<"excel will be created"<<endl;
}

factorymethod.cpp

#include "factorymethod.h"fileinstance *wordfactory::creatfile()
{return new word();
}fileinstance *pptfactory::creatfile()
{return new ppt();
}fileinstance *excelfactory::creatfile()
{return new excel();
}

run.cpp

#include "run.h"run::run(creatfilefactory *factory)
{cout<<__func__<<endl;m_factory=factory;
}run::~run()
{cout<<__func__<<endl;if (m_factory) {delete m_factory;m_factory=nullptr;}
}void run::startrun()
{cout<<__func__<<endl;fileinstance *instance=m_factory->creatfile();//多态创建工厂instance->file();//多态生成文件
}

main.cpp

#include "run.h"int main(int argc, char const *argv[])
{run r(new pptfactory());//将易变化的代码(new pptfactory())限制在main函数中r.startrun();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project( dect_rect )
INCLUDE_DIRECTORIES(include)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
add_executable(factorymethod ./src/products.cpp ./src/factorymethod.cpp ./src/run.cpp ./src/main.cpp)  

运行结果

如果要创建Word文件,只需要在main函数中修改r的参数,修改后重新编译运行的结果如下

可以看到只编译了main函数,而其他文件中的代码并没有参与编译,这样就降低了工厂基类和产品基类对变化部分(main)的依赖,提高了工厂基类和产品基类的模块化程度(耦合性降低),而且工厂基类和产品基类的可复用性和扩展性也更高

参考:

https://www.bilibili.com/video/BV1kW411P7KS?p=8

《设计模式,可复用面向对象软件的基础》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

工厂方法(父类定义创建对象的接口,通过多态让子类来创建具体的对象)相关推荐

  1. java 通常在函数内部创建对象还是在外部创建对象_java中为什么在主函数中创建外部类对象可以,创建内部类对象就失败了呢?2类不都是非静态的吗?...

    展开全部 public class OuterClass { public static void main(String[] args) { OuterClass outerClass = new  ...

  2. 学习设计模式——工厂方法模式

    2019独角兽企业重金招聘Python工程师标准>>> 1. 认识工厂方法模式 1. 功能:定义一个用于创建对象的接口,让子类决定实例化哪一个类,该模式使一个类的实例化延迟到其子类中 ...

  3. 设计模式 工厂方法_工厂方法设计模式

    设计模式 工厂方法 工厂方法模式是流行的创作设计模式之一. 它并不特别依赖于工厂对象来创建对象. 而是要在同一类中使用单独的方法来创建对象. Factory Method模式定义了一个用于创建对象的接 ...

  4. Java——设计模式(工厂方法模式)

    * A:工厂方法模式概述* 工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现.* 简单来说:先定义一个工厂,工厂里面有些方法,这些方法就是用来创建动物的,然 ...

  5. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  6. 设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  7. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  8. 考虑使用静态工厂方法替代构造方法

    转自 https://www.cnblogs.com/chenpi/p/5981084.html 阅读目录 创建对象 注意区分静态工厂方法和工厂方法模式 使用静态工厂方法的优势 使用静态工厂方法的缺点 ...

  9. html5创建对象的方法,JavaScript面向对象-使用工厂方法和构造函数方法创建对象...

    在上一篇文章中我们介绍了JavaScript简单对象的创建方法,简单js对象的最大问题是由于没有类的约束,无法实现对象的重复利用,并且没有一种约定,在操作时会带来问题.所以人们从设计模式中借用了一种工 ...

最新文章

  1. VMware ESXi 中的 CentOS 硬盘扩容
  2. DevExpress控件安装和初次使用图解
  3. win7-X64下用VM安装linux系统CentOS
  4. Chrome DevTools 之 Network,网络加载分析利器
  5. 剑指 offer set 19 翻转单词顺序 字符串左旋
  6. APP技巧:电脑登录微信,要删除这5个文件!否则别人能查看聊天记录
  7. 0.Overview——Deep Learning
  8. 为什么阿里全面推动 K8S 落地,咬紧牙关也要搞云原生?
  9. 输在学历的起跑线上?没关系,10本书助你技能爆表升职加薪
  10. Linux系统日常维护命令
  11. VUE系列-Vue中组件的应用(三)
  12. 【转载】Java程序设计入门 (二)
  13. 1.[精通Hibernate笔记]Hibernate简介
  14. python 运行时 变量_在运行时在python中检索变量的名称?
  15. accept - 指示打印系统接受发往指定目标打印机的打印 任务
  16. 抖音python上的代码_抖音代码舞「图文推荐」,python实例代码
  17. 26 图的邻接矩阵:深度优先遍历
  18. matlab虚拟示波器,虚拟示波器是什么_虚拟示波器详解
  19. ais文件还原到mysql_金蝶kis系列数据库(.ais)打开与账套恢复办法
  20. swagger生成redoc文档

热门文章

  1. zabbix3.2.6.1升级3.4.4图文心得
  2. Sandcastle帮助文档生成器使用介绍
  3. JMX操作ActiveMQ(2)
  4. Jsp实现图书馆借阅管理系统
  5. 鹅厂2020暑期实习第二次二面
  6. Linux学习笔记:touch新建文件、修改访问、改动时间
  7. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令
  8. C#连接Oracle数据库的方法(Oracle.DataAccess.Client也叫ODP.net)
  9. 使用amaze ui的分页样式封装一个通用的JS分页控件
  10. sqlserver bulk insert