热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式3——抽象工厂模式(创建型模式)

抽象工厂模式是工厂模式的升级。相对而言,抽象工厂模式并不像工厂模式那么好理解,看了不少网上博客的描述,感觉都说说的云里雾里,个人觉得还是把抽象问题具体化更好。推崇《大话设计模式》中的讲解模式。本文讲以更通俗的语言,结合《大话设计模式》中使用的实例,把抽象工厂模式理清楚。

1. 对工厂模式的回顾

先总结下个人对工厂模式的理解:

工厂模式中的类主要分两大类群,一是产品类群,而是工厂类群。

设计模式3——抽象工厂模式(创建型模式)

工厂类群这边,把生成产品的步骤,提取出来并做了抽象,即:工厂基类中抽象出的createOperation()方法,具体的建造过程是在具体产品对应的工厂类中实现的。

产品类群这边,将所有产品所共有的一些行为抽象了出来,比如上图中的operation()方法,某个具体产品是怎样进行operation()的需要各个具体产品类自己去定义和实现。

总的来说,工厂模式是一个具体的工厂类对于一个具体产品类。当一个工厂需要生产多个产品时,是不是就傻眼了?这时候就需要“抽象工厂模式”闪亮登场了。

2. 《大话设计模式》中抽象工厂模式的具体案例:

实际项目工作中经常会涉及数据库的读写,这必然要从多个主流的数据库产品中选择一个,在自己的项目中使用。

一个项目做好后,如果换个用户,必然要对原项目进行修改,如果新用户提出换一种数据库,问题出来了:在项目的功能需求一致的情况下,数据库中所要创建和使用的table的结构肯定是一样的,数据处理逻辑也一样,但是,不同类型的数据库,比如Oracle和Access,具体的建表语句和访问语句是不一样的;如果,不提前抽象出建表逻辑、和数据处理逻辑,那在更换数据库过程中,必然带来庞大而混乱的工作量。

设计模式3——抽象工厂模式(创建型模式)

此时,我们就可以把一种数据库(database)当做一种工厂(product creator),每个数据库都对应有几个相同的表要生成,所以,可以把待建的某个table当做成一个product。

接着进行抽象操作:

产品端:每种产品都是一种Table,对应同一个表结构,每一种Table又有多种不同Database的实现形式

工厂端:每种工厂都是一种Database,对应可以生成相同外观的表,每一种Database又可以生成多种Table

设计模式3——抽象工厂模式(创建型模式)

 

3. 引出“抽象工厂模式”

以上是Database-Table的示例结构图,将Table转化成Product,Database转化中Creator之后边可得到抽象工厂模式的结构图:

设计模式3——抽象工厂模式(创建型模式)

从项目中使用一个新的数据库(工厂)的角度,只需要新增一个Creator_3类,同时新增Product_A_C3和Product_B_C3;此时客户端的调用中,只需要修改Creator creator = new Creator_3(),其他位置的调用无须修改,满足“修改封闭-扩展开放”原则。

如果是项目中新增一个Product,则会麻烦一些,此时Product端要新增对于多个Creator的产品类;同时,Creator端要对Creator的结构进行调整,主要是新增CreatPC()接口函数,各个Creator实现类也要对应新增。客户端的代码里也需要根据实际需要做修改。

 

 

 


推荐阅读
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
author-avatar
夡敧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有