热门标签 | 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实现类也要对应新增。客户端的代码里也需要根据实际需要做修改。

 

 

 


推荐阅读
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
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社区 版权所有