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

网站建设公司广东天津塘沽爆炸电影

网站建设公司广东,天津塘沽爆炸电影,湖北省建设厅网站证件,免费logo设计在线生成器官网工厂模式#xff08;Factory Pattern#xff09; 是创建型设计模式的核心成员#xff0c;它通过将对象创建的逻辑封装起来#xff0c;实现了创建与使用的解耦。本文将深入探讨工厂模式的核心思想、实现技巧以及在C中的高效实现方式。 为什么需要工厂模式#xff1f; 在软… 工厂模式Factory Pattern 是创建型设计模式的核心成员它通过将对象创建的逻辑封装起来实现了创建与使用的解耦。本文将深入探讨工厂模式的核心思想、实现技巧以及在C中的高效实现方式。 为什么需要工厂模式 在软件开发中直接使用new关键字创建对象会带来诸多问题 紧耦合客户端代码依赖具体类实现 难以扩展添加新产品需要修改客户端代码 职责混乱对象创建逻辑分散在各处 违反开闭原则对修改开放对扩展封闭 工厂模式通过封装对象创建过程解决了这些问题提供了一种灵活的创建机制。当你的代码中存在以下情况时工厂模式特别有用 无法预知需要创建的具体类型 需要集中管理对象的创建逻辑 系统需要支持多种类型的产品 希望将实例化延迟到子类 工厂模式的两种形态 1. 简单工厂模式静态工厂 简单工厂模式是最基础的形式它通过一个静态方法封装对象的创建逻辑。 #include iostream #include memory #include stdexcept// 抽象产品类图形接口 class Shape { public:virtual void draw() const 0;virtual ~Shape() default; };// 具体产品类圆形 class Circle : public Shape { public:void draw() const override {std::cout ○ 绘制圆形 std::endl;} };// 具体产品类矩形 class Rectangle : public Shape { public:void draw() const override {std::cout □ 绘制矩形 std::endl;} };// 具体产品类三角形 class Triangle : public Shape { public:void draw() const override {std::cout △ 绘制三角形 std::endl;} };// 简单工厂类 class ShapeFactory { public:// 形状类型枚举enum ShapeType { CIRCLE, RECTANGLE, TRIANGLE };// 创建形状的静态方法static std::unique_ptrShape createShape(ShapeType type) {switch (type) {case CIRCLE:return std::make_uniqueCircle();case RECTANGLE:return std::make_uniqueRectangle();case TRIANGLE:return std::make_uniqueTriangle();default:throw std::invalid_argument(错误不支持的形状类型);}} };// 创建具体实列 int main() {// 创建圆形auto circle ShapeFactory::createShape(ShapeFactory::CIRCLE);circle-draw();// 创建矩形auto rect ShapeFactory::createShape(ShapeFactory::RECTANGLE);rect-draw();// 创建三角形auto triangle ShapeFactory::createShape(ShapeFactory::TRIANGLE);triangle-draw();return 0; } 优点 实现简单易于理解 集中管理对象的创建逻辑 客户端与具体产品类解耦 缺点 违反开闭原则添加新产品需修改工厂类 工厂类职责过重所有产品都在一个工厂中创建 不支持运行时动态扩展 2. 工厂方法模式 工厂方法模式将对象创建延迟到子类解决了简单工厂的开闭原则问题。 #include iostream #include memory #include vector// 抽象产品日志记录器 class Logger { public:virtual void log(const std::string message) 0;virtual ~Logger() default; };// 具体产品文件日志 class FileLogger : public Logger { public:void log(const std::string message) override {std::cout [文件日志] message std::endl;} };// 具体产品控制台日志 class ConsoleLogger : public Logger { public:void log(const std::string message) override {std::cout [控制台日志] message std::endl;} };// 具体产品网络日志 class NetworkLogger : public Logger { public:void log(const std::string message) override {std::cout [网络日志] message std::endl;} };// 抽象创建者 class LoggerCreator { public:virtual std::unique_ptrLogger createLogger() 0;void logMessage(const std::string message) {auto logger createLogger();logger-log(message);}virtual ~LoggerCreator() default; };// 具体创建者文件日志工厂 class FileLoggerCreator : public LoggerCreator { public:std::unique_ptrLogger createLogger() override {return std::make_uniqueFileLogger();} };// 具体创建者控制台日志工厂 class ConsoleLoggerCreator : public LoggerCreator { public:std::unique_ptrLogger createLogger() override {return std::make_uniqueConsoleLogger();} };// 具体创建者网络日志工厂 class NetworkLoggerCreator : public LoggerCreator { public:std::unique_ptrLogger createLogger() override {return std::make_uniqueNetworkLogger();} };// 创建实例 int main() {std::vectorstd::unique_ptrLoggerCreator creators;creators.push_back(std::make_uniqueFileLoggerCreator());creators.push_back(std::make_uniqueConsoleLoggerCreator());creators.push_back(std::make_uniqueNetworkLoggerCreator());for (auto creator : creators) {creator-logMessage(应用启动完成);}return 0; } 核心思想 定义创建对象的接口但让子类决定实例化哪个类 工厂方法使一个类的实例化延迟到其子类 符合开闭原则 - 对扩展开放对修改关闭 工厂方法模式的高级应用 1. 参数化工厂方法 class UniversalCreator : public LoggerCreator { public:enum LoggerType { FILE, CONSOLE, NETWORK };UniversalCreator(LoggerType type) : type_(type) {}std::unique_ptrLogger createLogger() override {switch (type_) {case FILE: return std::make_uniqueFileLogger();case CONSOLE: return std::make_uniqueConsoleLogger();case NETWORK: return std::make_uniqueNetworkLogger();default: throw std::invalid_argument(无效的日志类型);}}private:LoggerType type_; };// 使用示例 int main() {UniversalCreator fileCreator(UniversalCreator::FILE);fileCreator.logMessage(保存到文件);UniversalCreator consoleCreator(UniversalCreator::CONSOLE);consoleCreator.logMessage(输出到控制台);return 0; } 2. 工厂方法 单例模式 class Database { public:virtual void connect() 0;virtual ~Database() default; };class MySQL : public Database { public:void connect() override {std::cout 连接到MySQL数据库 std::endl;}static MySQL getInstance() {static MySQL instance;return instance;}private:MySQL() default; };class PostgreSQL : public Database { public:void connect() override {std::cout 连接到PostgreSQL数据库 std::endl;}static PostgreSQL getInstance() {static PostgreSQL instance;return instance;}private:PostgreSQL() default; };class DatabaseFactory { public:virtual Database create() 0;virtual ~DatabaseFactory() default; };class MySQLFactory : public DatabaseFactory { public:Database create() override {return MySQL::getInstance();} };class PostgreSQLFactory : public DatabaseFactory { public:Database create() override {return PostgreSQL::getInstance();} };// 使用示例 int main() {MySQLFactory mysqlFactory;auto mysql mysqlFactory.create();mysql.connect();PostgreSQLFactory pgFactory;auto pg pgFactory.create();pg.connect();return 0; } 工厂模式的优缺点分析 优点 解耦创建者和具体产品 符合开闭原则易于扩展 单一职责原则创建逻辑集中 便于代码维护和测试 支持依赖倒置原则 缺点 引入额外类增加系统复杂性 需要设计良好的继承体系 客户端可能需要理解工厂结构 简单场景下可能显得过度设计 工厂模式的典型应用场景 框架设计框架需要为应用提供扩展点 class Plugin { public:virtual void execute() 0;virtual ~Plugin() default; };class PluginFactory { public:virtual std::unique_ptrPlugin createPlugin() 0; }; 跨平台开发为不同平台创建适配对象 class GUIButton { public:virtual void render() 0; };class WindowsButton : public GUIButton { /*...*/ }; class MacButton : public GUIButton { /*...*/ };class GUIFactory { public:virtual std::unique_ptrGUIButton createButton() 0; }; 对象池管理管理可重用对象的创建 class Connection { public:virtual void open() 0; };class ConnectionPool { public:virtual std::unique_ptrConnection createConnection() 0;virtual void returnConnection(std::unique_ptrConnection) 0; }; 依赖注入通过工厂注入依赖对象 class Service { public:virtual void performTask() 0; };class Client { public:Client(std::unique_ptrServiceFactory factory): factory_(std::move(factory)) {}void execute() {auto service factory_-createService();service-performTask();}private:std::unique_ptrServiceFactory factory_; }; 工厂模式的最佳实践 优先使用工厂方法除非系统非常简单否则优先选择工厂方法模式 结合智能指针使用std::unique_ptr或std::shared_ptr管理对象生命周期 使用模板减少重复代码 template typename T class StandardCreator : public LoggerCreator { public:std::unique_ptrLogger createLogger() override {return std::make_uniqueT();} };// 使用 StandardCreatorFileLogger fileCreator; 工厂方法命名规范 createXXX() makeXXX() newXXX() getInstance() (单例场景) 工厂模式 vs 简单工厂 特性简单工厂模式工厂方法模式开闭原则违反修改工厂类支持扩展子类复杂度简单中等扩展性有限优秀类数量较少较多每个产品对应工厂适用场景产品类型少且固定产品类型多或可能扩展 总结 工厂模式是C开发中强大的对象创建工具通过封装对象的创建过程它实现了 解耦客户端代码与具体类实现分离 扩展性轻松添加新产品而不影响现有代码 可维护性集中管理创建逻辑 灵活性支持运行时决策和配置 在实际开发中应当根据具体需求选择合适的工厂模式变体 对于简单场景简单工厂足够高效 对于需要高度扩展的系统工厂方法是最佳选择 避免过早优化但为未来扩展留有余地 设计模式不是银弹而是工具箱中的工具。工厂模式是其中最常用且强大的工具之一。 - 设计模式实践者
http://www.pierceye.com/news/197128/

相关文章:

  • 如何查询网站域名备案建设网站找什么问题
  • 南开大学 网站开发技术 刘冲网站排名优化有哪些牛霸天的软件1
  • 高品质网站设计北京市地铁建设管理公司网站
  • 初次建设网站的技巧织梦做分类信息网站
  • 宣讲家网站官网加强作风建设网站业务怎么做的
  • 厚街网站建设价格做办公室的网站
  • 青海做网站找谁wordpress gif缩略图
  • 手机网站全屏显示如何把自己做的网站放到微信上
  • 网站建设云雅淇wordpress
  • 工作室网站需要备案吗python基础教程编程题
  • 建设工程人才招聘信息网站响应式网站 cms
  • 设计签名免费网站福州的网站建设
  • 太原这边有做网站的吗wordpress实现pdf浏览
  • 制作微信公众号的网站开发30岁做网站运营
  • 松江手机网站开发正规免费代理
  • 太原市建设路小学网站昆山住房与城乡建设局网站
  • 石家庄的网站的公司计算机应用技术专业网站开发方向
  • 网站优化软件排行榜八年级微机网站怎么做
  • 织梦网站漏洞cms网站开发流程
  • 网站开发规划书怎么写企业cms开源
  • html网站免费下载海珠区建网站
  • 石家庄住房城乡建设厅网站宿迁网站建设推广公司
  • 广州模板网站建设费用2024新闻热点摘抄
  • 河北秦皇岛建设局网站做网站简单的软件
  • 上海网站开发外包公司最新新闻热点事件短篇
  • wordpress实现网站勋章功能网站建设需要什么资质
  • 河北沙河市建设局网站威海好的网站建设公司
  • 网站建设怎么放到云空间上海企业网站模板
  • 设计和建设企业网站心得和体会wordpress和新浪微博同步
  • 网站底部横条导航代码制造业erp系统软件有哪些