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

兰州模板型网站建设学软件工程培训就业机构

兰州模板型网站建设,学软件工程培训就业机构,wordpress英文主题出现汉字,wordpress带支付宝主题前言 在软件工程领域,设计模式是解决常见问题的经典方案。本文将深入探讨两种创建型模式:工厂方法模式和抽象工厂模式,通过理论解析与实战代码示例,帮助开发者掌握这两种模式的精髓。 一、工厂方法模式(Factory Metho…

前言

在软件工程领域,设计模式是解决常见问题的经典方案。本文将深入探讨两种创建型模式:工厂方法模式抽象工厂模式,通过理论解析与实战代码示例,帮助开发者掌握这两种模式的精髓。


一、工厂方法模式(Factory Method Pattern)

1.1 模式思想

工厂方法模式的核心在于将对象的创建延迟到子类,通过定义创建对象的接口,让子类决定实例化哪个类。这种模式完美体现了依赖倒置原则

1.2 模式结构

  • Product:抽象产品接口
  • ConcreteProduct:具体产品实现
  • Creator:抽象创建者
  • ConcreteCreator:具体创建者

1.3 代码示例

#include <iostream>
#include <string>class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {void draw() {std::cout << "Circle::draw()" << std::endl;}
};class Rectangle : public Shape {void draw() {std::cout << "Rectangle::draw()" << std::endl;}
};class Square : public Shape {void draw() {std::cout << "Square::draw()" << std::endl;}
};class ShapeFactory {
public:Shape* getShape(const std::string& shapeType) {if (shapeType.empty()) {return nullptr;}if (shapeType == "CIRCLE") {return new Circle();} else if (shapeType == "RECTANGLE") {return new Rectangle();} else if (shapeType == "SQUARE") {return new Square();}return nullptr;}
};
#include "factory_mode.h"int main(int argc, char const* argv[]) {ShapeFactory* shapeFactory = new ShapeFactory();Shape* shape1 = shapeFactory->getShape("CIRCLE");shape1->draw();Shape* shape2 = shapeFactory->getShape("RECTANGLE");shape2->draw();Shape* shape3 = shapeFactory->getShape("SQUARE");shape3->draw();delete shapeFactory;return 0;
}

1.4 运行结果

1.5 适用场景

  • 需要灵活扩展产品类型
  • 创建过程需要封装处理逻辑
  • 需要解耦客户端与具体产品类

二、抽象工厂模式(Abstract Factory Pattern)

2.1 模式思想

抽象工厂模式通过创建相关对象族来提升系统的扩展性,强调产品系列的概念。它比工厂方法模式更高层次的抽象。

2.2 模式结构

  • AbstractFactory:抽象工厂接口
  • ConcreteFactory:具体工厂实现
  • AbstractProduct:抽象产品接口
  • ConcreteProduct:具体产品实现

2.3 代码示例

产品定义:

#include <iostream>
#include <string>
// 
class Color {
public:virtual void fill() = 0;
};class Red : public Color {
public:void fill() {std::cout << "Red::fill()" << std::endl;}
};class Green : public Color {
public:void fill() {std::cout << "Green::fill()" << std::endl;}
};class Blue : public Color {
public:void fill() {std::cout << "Blue::fill()" << std::endl;}
};
// 形状产品
class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {void draw() {std::cout << "Circle::draw()" << std::endl;}
};class Rectangle : public Shape {void draw() {std::cout << "Rectangle::draw()" << std::endl;}
};class Square : public Shape {void draw() {std::cout << "Square::draw()" << std::endl;}
};

 抽象工厂

#include "color.h"
#include "shape.h"
// 抽象工厂
class AbstractFactory {
public:virtual Shape* getShape(const std::string& shapeType) = 0;virtual Color* getColor(const std::string& colorType) = 0;
};

 实体工厂

#include "abstract_factory.h"
// 实体工厂类// 形状工厂
class ShapeFactory : public AbstractFactory {
public:Shape* getShape(const std::string& shapeType) {if (shapeType.empty()) {return nullptr;}if (shapeType == "CIRCLE") {return new Circle();} else if (shapeType == "RECTANGLE") {return new Rectangle();} else if (shapeType == "SQUARE") {return new Square();}return nullptr;}Color* getColor(const std::string& colorType) {return nullptr;}
};// 颜色工厂
class ColorFactory : public AbstractFactory {
public:Color* getColor(const std::string& colorType) {if (colorType.empty()) {return nullptr;}if (colorType == "RED") {return new Red();} else if (colorType == "GREEN") {return new Green();} else if (colorType == "BLUE") {return new Blue();}return nullptr;}Shape* getShape(const std::string& shapeType) {return nullptr;}
};

 生产商:

#include "factory.h"class FactoryProducer {
public:static AbstractFactory* getFactory(const std::string& choice) {if (choice == "SHAPE") {return new ShapeFactory();} else if (choice == "COLOR") {return new ColorFactory();}return nullptr;}
};

main:

#include "producer.h"// 抽象工厂 demo
int main(int argc, char const* argv[]) {AbstractFactory* shapeFactory = FactoryProducer::getFactory("SHAPE");Shape* shape1 = shapeFactory->getShape("CIRCLE");shape1->draw();Shape* shape2 = shapeFactory->getShape("RECTANGLE");shape2->draw();Shape* shape3 = shapeFactory->getShape("SQUARE");shape3->draw();AbstractFactory* colorFactory = FactoryProducer::getFactory("COLOR");Color* color1 = colorFactory->getColor("RED");color1->fill();Color* color2 = colorFactory->getColor("GREEN");color2->fill();Color* color3 = colorFactory->getColor("BLUE");color3->fill();delete shapeFactory;delete colorFactory;return 0;
}

2.4 运行结果

2.5 适用场景

  • 需要创建多个相关对象组成的系列
  • 系统需要支持不同产品族的切换
  • 产品对象之间存在约束关系

三、核心差异对比

维度工厂方法模式抽象工厂模式
抽象层次单个产品创建产品族创建
扩展方向垂直扩展(新增产品类型)水平扩展(新增产品族)
实现方式继承组合
系统复杂度简单复杂
典型应用场景日志记录器、支付方式跨平台UI组件、数据库访问

四、模式选择指南

  • 选择工厂方法模式当:

    • 需要解耦客户端与具体产品类
    • 系统需要支持多种同类产品的创建
    • 产品类型相对单一
  • 选择抽象工厂模式当:

    • 需要创建多个相互关联的产品
    • 需要保证产品之间的兼容性
    • 系统需要支持不同产品族的切换

五、最佳实践建议

  1. 优先使用工厂方法:当产品结构简单时,避免过度设计
  2. 注意开闭原则:通过扩展而非修改来增加新产品
  3. 使用依赖注入:结合Spring等框架实现更灵活的工厂管理
  4. 文档化产品族:明确各产品之间的约束关系
  5. 性能考量:复杂工厂实现需要考虑对象池等优化手段

结语

        掌握工厂模式是成为架构师的重要阶梯。工厂方法模式像专业工匠,专注单一产品的精雕细琢;抽象工厂模式如生产总监,统筹协调整个产品家族。理解它们的差异,才能在系统设计中做出最合适的选择。 


文章转载自:

http://v2zA8IAs.zxqyd.cn
http://hzVvk2pZ.zxqyd.cn
http://J7kw58MT.zxqyd.cn
http://nIRPNro3.zxqyd.cn
http://zKZUsWUj.zxqyd.cn
http://sITs3CXb.zxqyd.cn
http://0a4vY6eQ.zxqyd.cn
http://5VQovJtx.zxqyd.cn
http://fkBXAtBv.zxqyd.cn
http://mRj062Rq.zxqyd.cn
http://WLqdvrRM.zxqyd.cn
http://kgYgPfdm.zxqyd.cn
http://i6yNg3t5.zxqyd.cn
http://uYzYE7s0.zxqyd.cn
http://oyKStJDq.zxqyd.cn
http://3iIWvbGl.zxqyd.cn
http://5yxDYJYl.zxqyd.cn
http://SbhbOE6M.zxqyd.cn
http://g36KPrVt.zxqyd.cn
http://G0LQveX1.zxqyd.cn
http://KIFi4rak.zxqyd.cn
http://ZqoxZssC.zxqyd.cn
http://jScrYldZ.zxqyd.cn
http://NGYY8KUc.zxqyd.cn
http://JtIt2p0y.zxqyd.cn
http://QvaQIPiY.zxqyd.cn
http://XmxeiFoi.zxqyd.cn
http://PMimV7Z3.zxqyd.cn
http://Nub37TRL.zxqyd.cn
http://EnEWFZSZ.zxqyd.cn
http://www.dtcms.com/wzjs/752016.html

相关文章:

  • 印度做杂质的网站冷饮网站开发背景意义
  • 企业网站管理系统程序名称网上商城图片
  • 做视频网站需要什么高端技术沈北新区建设局网站
  • 青岛营销型网站推广网站开发毕业设计中期检查表
  • 彬县网站精准客源app
  • 自己建一个网站做电子商务男女做爰视频免费网站
  • 珠海网站建设官网在什么网站能找到做外贸的邮箱
  • 平邑住房和城乡建设局网站促销策划
  • 上海招聘网站建设wordpress数据
  • 网站主页作品欣赏有寓意的logo设计图片
  • 厂房装修东莞网站建设php公司网站
  • 两学一做网站是多少钱住房城乡建设部官方网站
  • 网站一般都是用什么软件做的北京美的网站
  • 在哪里可以学到做网站如何创建自己的博客
  • 厦门市建设局思明建设分局官方网站网站首页静态好还是动态好
  • 厦门大型服装商城网站建设南京明辉建设有限公司网站
  • 书店网站怎么做Wordpress福利资源模板
  • 做母婴产品哪个网站做的好杭州外贸网站建设公司价格
  • 一款蛋糕食品类企业手机网站源码浏览器下载安装2023最新版
  • 一个网站如何做cdn加速器用百度网盘做视频网站
  • 第一简历模板网搜索引擎优化
  • 淘宝网站建设的目标seo优化排名易下拉技巧
  • 一个ip做几个网站吗动易会提示模版文件"默认网站首页问答模板.html"找不到
  • 用织梦做网站都需要用什么网站建设方案书腾讯云
  • 现在怎么建设一个网站外贸行业网络推广
  • 怎么做网站转盘易迈互联网站建设怎么样
  • 济南市网站建设怎么弄网站做网站卖东西
  • 企业网站建设基本要素北京平面设计网站
  • 网站无法被百度收录三门峡市住房建设局网站
  • 对于网站建设的体会广州开发小程序