推荐阅读设计模式 C++简单工厂模式

工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断。这样子显然不符合我们代码开发中的开闭原则,拓展起来也是非常麻烦的

工厂方法模式 = 简单工厂模式 + “开闭原则”

定义思想:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的就是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类

优点

  1. 不需要记住具体的类名,甚至连具体参数都不需要记住
  2. 实现了对象创建和使用的分离
  3. 系统的可扩展性变得更好,符合开闭原则

缺点

  1. 系统中的类是成对增加,增加了系统的复杂度和理解度

适用场景

  1. 客户端不需要知道具体产品类的名字,只需要知道其所对应的工厂即可
  2. 不关心类的创建和实现的细节

代码实现:(手机产品)

//抽象手机
class AbstractPhone
{public:virtual void ShowName() = 0;
};//华为
class Huawei : public AbstractPhone
{public:virtual void ShowName(){cout << "Huawei Phone" << endl;}
};//小米
class Xiaomi : public AbstractPhone
{public:virtual void ShowName(){cout << "Xiaomi Phone" << endl;}
};//苹果
class Apple : public AbstractPhone
{public:virtual void ShowName(){cout << "Apple Phone" << endl;}
};//抽象工厂
class AbstractPhoneFactory
{public:virtual AbstractPhone* CreatePhone() = 0;
};//华为工厂
class HuaweiFactory : public AbstractPhoneFactory
{public:virtual AbstractPhone* CreatePhone(){return new Huawei();}
};//小米工厂
class XiaomiFactory : public AbstractPhoneFactory
{public:virtual AbstractPhone* CreatePhone(){return new Xiaomi();}
};//苹果工厂
class AppleFactory : public AbstractPhoneFactory
{public:virtual AbstractPhone* CreatePhone(){return new Apple();}
};

测试:

void test()
{//创建一个工厂AbstractPhoneFactory* factory = nullptr;//创建一个手机AbstractPhone* phone = nullptr;//指定工厂是华为工厂factory = new HuaweiFactory;//通过华为工厂创建一个手机phone = factory->CreatePhone();phone->ShowName();delete phone;delete factory;factory = new XiaomiFactory;phone = factory->CreatePhone();phone->ShowName();delete phone;delete factory;factory = new AppleFactory;phone = factory->CreatePhone();phone->ShowName();delete phone;delete factory;
}

运行结果:

推荐阅读设计模式 C++抽象工厂模式

设计模式 C++工厂方法模式相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  4. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  5. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  6. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  7. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  8. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  9. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  10. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

最新文章

  1. linux中安装vsftpd出现的问题
  2. Java面试题—内部类和静态内部类的区别
  3. beego原生mysql查询_Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)...
  4. IDEA 自动生成类注释和方法注释
  5. eclipse常见小问题
  6. 大数据的可视化:bigvis包的简单尝试
  7. cad插件加载bplot成功用不了_Batchplot批量打印命令无效,对照情况进行解决
  8. 日常学习笔记-RGB配色和颜色转换
  9. 计算机上网记录怎么清除,win7系统彻底清除上网记录的详细方法
  10. 双引号后面要加句号吗_引号里应不应该用句号,双引号后的句号在前还是在后?...
  11. php后缀加swp,当编辑文件出现swp的时候如何处理
  12. Java迷你共享单车系统(面向对象作业)
  13. 输入三角形的3条边长(均为正整数),如果不能构成一个三角形,则输出“not a triangle”;如果能够构成一个直角三角形,则输出“yes”;如果不能构成直角三角形,则输出“no”。
  14. back_inserter的使用
  15. 线性代数-向量组的线性相关
  16. Windows下UDP编程
  17. TuneBoto Amazon Video Downloader for mac(亚马逊视频下载器)
  18. js下载文件修改文件名 (跨域)
  19. 教你如何训练和提高自己的情商
  20. 常用坐标系简介以及转换(附代码)

热门文章

  1. 机房设备服务器维护细则,机房安全管理方面的管理制度
  2. azure虚拟服务器,虚拟机系列
  3. 一维转二维_Excel – 一维表和二维表相互转换,只要一个“=”搞定
  4. mysql还要mysqldump的备份文件到指定数据库
  5. php smarty thinkphp,用新版的thinkphp3.2.3和新版的smarty3.1.29
  6. 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(2)
  7. npm vue安装教程
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的教材管理系统
  9. bzoj 4006 管道连接 —— 斯坦纳树+状压DP
  10. Confluence 6 企业环境或者网站托管的 Java 配置策略