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

设计模式——抽象工厂方法(abstract factory)

目录

  • 1. 引言
  • 2. 实例
  • 3. 核心思想总结

1. 引言

  如果要用一句话来形象地解释抽象工厂(Abstract Factory)模式,我们可以想象这样一个场景:
你正在设计一款“小咪手机”,这款手机由多个部件组成,比如屏幕、摄像头、电池、芯片等。现在你需要决定这些零部件从哪里来。
  方案一:为每种零部件建立一个独立的工厂,再由总装车间统一组装。
  方案二:建立一个“大工厂”,它内部包含多个流水线,可以一次性生产属于同一品牌或风格的所有零部件。
  很明显,方案二更方便管理,也更容易保证整体兼容性。这个“大工厂”就是抽象工厂模式的核心思想——为一组相关相互依赖的产品提供统一的创建接口。

  这里的“抽象”并不是指模糊,而是指隔离变化隐藏具体实现。
  抽象工厂定义了一个“工厂接口”,它不关心每个具体工厂如何实现,而是通过这一层抽象,让我们可以在不修改客户端代码的前提下,方便地切换产品族(比如从“小咪品牌”切换到“大花品牌”)。

因此可以理解为:

  1. “抽象”意味着不依赖具体实现;
  2. “抽象”意味着可以自由切换同类产品族。

2. 实例

  现在我们要创建一个界面,但是界面有多种不同的风格,并且每种风格都有多种相关的组件(widge)。这时候我们就可以创建相关抽象类(abstract)和具体类(concrete), 如下图。现在有两大类风格的多种组件。

  • PM
    • PM-scrollBar
    • PM-window
  • Motlf
    • Motlf-scrollBar
    • Motlf-window

每个组件的行为类似,我们为风格相同的组件创建具体的工厂,每个工厂的行为也是相似的,于是将其抽象化,这样我们就得到了一个统一的接口,所有的操作都可以传递,并且用户不需要知道具体的逻辑。
在这里插入图片描述

class ScrollBar {
public:virtual void Scroll() = 0;virtual ~ScrollBar() = default;
};class PMScrollBar : public ScrollBar {
public:void Scroll() override {std::cout << "PM style scrollbar scrolling..." << std::endl;}
};class WidgetFactory{
public:virtual ScrollBar* CreateScollBar() = 0;...
}class PMWidgetFactory : public WidgetFactory{
public:ScrollBar* CreateScollBar() override{return (ScrollBar*)new PMScrollBar();}...
}void create_product(WidgetFactory* factory){// 创建产品
}int main(){...WidgetFactory* factory = new PMWidgetFactory();create_product(factory);...
}

3. 核心思想总结

创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。

达到:

  • 客户端只依赖于工厂接口;
  • 不关心具体对象的创建细节;
  • 可以在不修改客户端代码的前提下替换整个产品族。

在这里插入图片描述

角色含义
AbstractFactory抽象工厂接口,声明创建抽象产品的方法
ConcreteFactory具体工厂,实现创建具体产品的方法
AbstractProduct抽象产品接口,定义产品的通用行为
ConcreteProduct具体产品,实现抽象产品接口
Client客户端,通过抽象工厂创建产品,只与抽象接口交互
http://www.dtcms.com/a/549649.html

相关文章:

  • 追剧狂人网页入口 - 免费影视在线观看网站
  • 以太网多参量传感器:工业物联网时代的安全监测革新
  • wordpress整站模板php 怎么做视频网站
  • Rust 内存对齐与缓存友好设计
  • 百度快照 直接进网站wordpress小工具缓存
  • 【英飞凌TC364】点亮LED灯
  • LeetCode 3346.执行操作后元素的最高频率 I:滑动窗口(正好适合本题数据,II再另某他法)
  • 【STM32】FLASH闪存
  • 东莞网站关键词推广义乌百度推广公司
  • Spring远程调用与Web服务全解析
  • 手机站喝茶影视茂名市建设银行网站
  • 青岛做网站公司排名淄博网站建设yx718
  • 303-Spring AI Alibaba NL2SQL 向量管理示例
  • 【CVPR 2025】即插即用GBC模块:小体积,大能量,重塑特征提取新范式
  • Linux系统编程 -- 进程概念(一)
  • React 入门 02:从单页面应用到多页面应用
  • 石家庄网站建设找哪家好河西网站建设优化seo
  • h5网站怎么做api对接赣州人才招聘网
  • 生产管理系统详解:物料清单bom 工序,工艺路线中的工序和工艺资源他们之间有什么关联和区别
  • 发布元服务配置应用分类、标签和资质信息(仅分发手表设备)
  • 成绩查询系统如何制作?
  • 中国建设银行信用卡官网站首页个人做商机网站如何盈利
  • springboot酒店客房管理系统设计与实现(代码+数据库+LW)
  • 交叉编译工具链深度解析 --静态库与动态库编译实战指南
  • uni-app 开发APP应用媒体处理与文件管理功能
  • 网站建设scyiyou百度竞价推广一个月多少钱
  • 基于整数MCU的FOC控制定标策略深度解析
  • [HDiffPatch] 差异算法 | `serialize_compressed_diff`
  • Pycatia二次开发基础代码解析:实例名称获取与几何显示控制技术解析
  • 小迪安全v2023学习笔记(一百四十天)—— Linux系统权限篇VulnhubPATH变量NFS服务Cron任务配合SUID