当前位置: 首页 > 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 {...}        }
http://www.lryc.cn/news/312857.html

相关文章:

  • 使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件
  • python并发 惰性处理大型数据集
  • Docker将本地的镜像上传到私有仓库
  • [LeetBook]【学习日记】有效数字——状态机
  • 学习目标2024
  • 引入js,刷新清除缓存
  • 【VSCODE修改代码行间距】解决方案
  • lvs+keepalive
  • 用spark读取及存储数据
  • 蓝牙 | 软件: Qualcomm BT Audio 问题分析(4)----检查MIPS使用情况
  • 【实战】K8S集群部署nacos并接入Springcloud项目容器化运维
  • prometheus监控zookeeper方案
  • 智能照明控制系统的优点有哪些
  • Cent OS 安装 vmware tools
  • 写一个关于RN的分秒毫秒组件(组件状态由同一个父组件控制)
  • javascript中字符串处理,常用的方法汇总
  • STM32CubeMX学习笔记14 ---SPI总线
  • Gson(List<Object>转String 、String转List<Object>)
  • uniapp路由跳转的方式
  • 使用Python模拟绘制自由落体运动过程中的抛物线
  • 批量爬取网站图片脚本
  • scrapy 爬虫:多线程爬取去微博热搜排行榜数据信息,进入详情页面拿取第一条微博信息,保存到本地text文件、保存到excel
  • 网络、UDP编程
  • VSCode安装与使用
  • 进程和线程的区别与联系
  • 6、Redis-KV设计、全局命令和安全性
  • python之海龟绘图
  • Java实战:Spring Boot 实现异步记录复杂日志
  • “色狼”用英语怎么说?柯桥日常英语,成人英语口语学习
  • Docker前后端项目部署