当前位置: 首页 > news >正文

【设计模式】工厂模式与抽象工厂模式

工厂方法

以图书馆管理系统为例,需要API提供查询不同专业分类的书目列表,一般实现,

class LibraryManager {
public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type == TA) {return ...;} else if (type == TB) {} else if (...) {//...} else {return type_null;}        }
};

可以把构建返回对象,提取到工厂类,

class BookFactory {
public:Booklist CreateBooklist(Type type) {if(type == TA) {return ...;} else if (type == TB) {} else if (...) {//...} else {return type_null;} }
};
class LibraryManager {
public:LibraryManager(BookFactory factory) {this.factory_ = factory;}BookList Query(Type type) {return this.factory.CreateBooklist(type);}
private:this.factory_;
};

现在增加一个需求,增加文学书籍类,专业类、文学类都要支持按语种检索,工厂模式便于对新增需求的扩展,

class BookFactory {
public: virtual Booklist CreateBooklist(Type type) = 0;
}
class LanguageBookFactory: public BookFactory {
public: Booklist CreateBooklist(Type type) {//}
};
class ProfessionalBookFactory: public BookFactory {
public: Booklist CreateBooklist(Type type) {//}
};

抽象工厂方法

另一个场景,读者查、借还书都需要管理系统从数据库查询书籍、读者账户系统,同时考虑系统未来用不同的第三方数据库,如何设计呢?

class LibraryManager {
public:void QueryDB() {if(config_.db_type == MYSQL) {//具体实现} else if(config_.db_type == SQLLITE) {...} else {...}        }
private:
Config config_;
};

用统一的工厂接口提供获取数据的功能,

class DataFactory {
public:virtual ReaderInfo RetriveReaderInfo() = 0;virtual BookInfo RetriveBookInfo() = 0;
};
class DataFactoryMysql: public DataFactory {
//具体实现
}
class DataFactorySqllite: public DataFactory {
//具体实现
}
class LibraryManager {
public:void QueryDB() {if(config_.db_type == MYSQL) {auto mysql = std::make_shared<DataFactoryMysql>();mysql->RetriveReaderInfo();} else if(config_.db_type == SQLLITE) {...} else {...}        }

相关文章:

  • SEO关键词策略:如何选取最适合你网站的关键词?
  • 一个简单的回调函数
  • IOS开发0基础入门UIkit-1cocoapod安装、更新和使用 , 安装中出现的错误及解决方案 M1或者M2安装cocoapods
  • javaSE-----继承和多态
  • 地平线零之曙光图文攻略,地平线零之曙光在MAC电脑能玩吗
  • vue2 element 实现表格点击详情,返回时保留查询参数
  • Windows Docker 部署 MySQL
  • 【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解
  • 基于JavaWEB SpringBoot婚纱影楼摄影预约网站设计和实现
  • 【打工日常】使用docker部署IT运维管理平台CAT
  • 微信小程序开发系列(十七)·事件传参·mark-自定义数据
  • 使用插件vue-seamless-scroll 完成内容持续动态
  • leetcode热题100刷题计划
  • Dgraph 入门教程四(开发环境的搭建)
  • 力扣面试经典150 —— 6-10题
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2017 年终总结 —— 在路上
  • es的写入过程
  • JavaScript 奇技淫巧
  • java小心机(3)| 浅析finalize()
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 初探 Vue 生命周期和钩子函数
  • 基于axios的vue插件,让http请求更简单
  • 普通函数和构造函数的区别
  • 微信支付JSAPI,实测!终极方案
  • 移动端唤起键盘时取消position:fixed定位
  • 应用生命周期终极 DevOps 工具包
  • 正则表达式小结
  • Java性能优化之JVM GC(垃圾回收机制)
  • 阿里云ACE认证之理解CDN技术
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #Linux(权限管理)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • ${factoryList }后面有空格不影响
  • (8)STL算法之替换
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (数据结构)顺序表的定义
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (学习日记)2024.01.09
  • (转)Linq学习笔记
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 连接数据库,通过数据库生成Modell
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET程序员迈向卓越的必由之路
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net中调用windows performance记录性能信息
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [20170728]oracle保留字.txt
  • [20171101]rman to destination.txt