千机游戏提供最新游戏下载和手游攻略!

深入解析设计模式:工厂模式(简单工厂、工厂方法、抽象工厂)

发布时间:2024-10-26浏览:95

大家好,今天给各位分享深入解析设计模式:工厂模式(简单工厂、工厂方法、抽象工厂)的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

下面通过支付场景实践说明一下简单工厂方法

支付示例(简单工厂模式)

支付示例(简单工厂模式+反射)

简单工厂方法在源码中的使用

所以在我们平常开发的过程中也不是说必须的要符合开闭原则,类似的情况也可以使用简单工厂模式,找到最适合你们代码逻辑的模式,不是强加硬套。

适用场景

  • 创建需要大量重复代码
  • 工厂方法不会轻易改动的(这个比较重要如果经常改动建议使用工厂方法模式或者抽象工厂)
  • 工厂方法模式

    上文也说道了简单工厂模式。简单工厂模式有一个很大的弊端就是不符合开闭原则,那么在使用的时候限制就比较多。工厂方法模式在这方面做了优化,那什么是工厂方法模式呢。

    工厂方法模式是指定义一个创建对象的接口,但是实现让这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到了子类中进行。在工厂方法模式中用户只需要关系所需要产品对应的工厂,无需关心创建的细节,而且加入新的产品符合开闭原则。

    通俗点说就是将工厂抽象出来,一个产品类对应的是一个工厂,客户端在需要实例化的时候选择指定的工厂拿到对应类就可,和简单工厂的区别在于简单工厂只有一个工厂,所有的类的实例化都揉在一个方法里面(当然这里可能有些人会反驳我,应为上文中最后一种优化完全不用写if else使用反射来实例化,但是实际情况可能每种类的实例化都不一样这个时候就不能再使用反射)而工厂方法是多个工厂一个产品对应一个工厂

    支付场景(工厂方法实现)

    此时客户端只需要关心它需要使用哪个工厂即可,如果需要新增或者删除一个支付方式只需要新增对应的工厂以及具体支付类或者删除对应的即可完全符合了开闭原则。

    相较于简单工厂模式优缺点

    优点:

  • 符合开闭原则
  • 工厂职责单一化易于维护
  • 缺点:

  • 类变多了(从上文中的类图中就可以明显看出来的缺点)
  • 适用场景

  • 创建对象需要大量的重复代码
  • 客户端不依赖于产品类示例如何被创建、实现等细节
  • 抽象工厂模式

    上文说到的工厂方法模式,假如是一个产品族(就是一个工厂不再是单一的只生产一种商品,而是生产多种商品,比如以前的苹果公司只生产电脑,后来社会在发展苹果公司需要迎合市场的需求开始生产手机,慢慢的又有平板电脑,现在又在造车),使用工厂方法模式就会发现类越来越多,多到不容易维护,难于理解。这个时候就比较适合使用抽象工厂方法。

    抽象工厂模式是指提供一个创建一系列相关或者项目依赖对象的接口,无需指定他们的具体类,客户端不依赖于产品类示例如何被创建实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码,需要提供一个产品类的库,所有的产品以同样的接口出现,从而是客户端不依赖于具体实现

    代码示例

    就拿上文的苹果公司做示例苹果公司会生产手机平板电脑、电脑、汽车,同样的我们中国的小米也生产这些产品

  • 首先将产品族定义一个抽象工厂(也就是说这个产品族能成产那些产品)
  • 这里定义了一个公司的工厂类(并不说生产公司,而是将所有公司能干的事情抽离抽象出来)
  • 定义每个产品的抽象类
  • 定义某个公司的工厂及产品实现类 苹果公司的工厂及实现类:
  • 小米公司的工厂及实现类
  • 调用:
  • 至此抽象工厂的举例实现就完成了我们可以看一下类图:

    大家可以发现如果还是使用工厂方法设计模式一个产品对应一个工厂方法目前两个公司就对应着2x4个工厂类再添加一个公司的话就是3x4个工厂类这里有些人可能听不懂为什么是2x4、3x4我们可以画图示意一下:

    抽象工厂方法的工厂是按照产品族走的也就是说上图的公司走的,一个工厂可以生产多个产品,所以抽象工厂方法有几个公司就有几个工厂。而工厂方法是跟产品走的,所以有几个产品对应应该有几个工厂。所以相较于工厂方法可以少创建很多类

    优缺点

    根据上文中的实例以及类图可以总结如下优缺点:优点:

  • 相比于工厂方法可以少创建很多类
  • 缺点:

  • 首先显而易见的是不符合开闭原则,如果增加一个产品那么冲总工厂到具体实现工厂都要增加对应的方法
  • 增加了系统的抽象性和理解难度
  • 适用场景

    其实几个工厂方法使用场景都差不太多,抽象工厂比较适合于大型产品设计,虽然抽象工厂不符合开闭原则,但其实在我们实际开发中只要不是频繁的升级修改也是可以不遵循开闭原则的

    原文链接:https://juejin.cn/post/7163177142577004558

    用户评论

    浮殇年华

    这篇文章讲解的挺清晰,我之前对工厂模式一直没太理解,看完之后感觉思路豁然开朗!

        有20位网友表示赞同!

    雪花ミ飞舞

    学习了好多新的知识!虽然代码实现还没上手,但是对“简单工厂”、“工厂方法”和“抽象工厂”的不同应用场景有了更清晰的认识。要动手写一下代码加深印象了。

        有6位网友表示赞同!

    慑人的傲气

    最近在项目中遇到类似产品角色创建的问题,这个工厂模式正好能帮到我!感谢作者分享经验,让我少走了很多弯路~

        有16位网友表示赞同!

    终究会走-

    工厂模式的确很實用,可以很大程度地减少代码重复,特别是对于产品种类繁多的场景,更显优势。这篇文章的结构很清晰,逻辑也很严谨。

        有6位网友表示赞同!

    从此我爱的人都像你

    我觉得这个抽象工厂模式太复杂了,如果项目规模不大,简单工厂就足够用了,额外的设计复杂度不一定值那么多收益。

        有9位网友表示赞同!

    凉笙墨染

    简单工厂模式真简单啊!上手容易,代码也写起来轻松。工厂方法和抽象工厂感觉复杂一些,需要多花点时间理解...

        有6位网友表示赞同!

    安好如初

    以前一直使用直接实例化对象的方式开发,现在看来还是学习一下工厂模式比较好,可以提高代码的复用性。

        有6位网友表示赞同!

    oО清风挽发oО

    这篇文章没有解释到工厂模式在实际应用中的常见场景和挑战,比如如何快速添加新的产品类型等。对这个方面更加深入的探讨会更有帮助。

        有5位网友表示赞同!

    余笙南吟

    工厂模式确实很有价值,但文章中提供的例子过于简单,不太能体现其强大之处。希望能看到一些更复杂的应用场景,来加深我的理解。

        有17位网友表示赞同!

    冷青裳

    工厂模式确实可以提高代码的灵活性和可维护性,我很喜欢这种设计思想! 文章结构清晰易懂,讲解也很到位!

        有12位网友表示赞同!

    瑾澜

    感觉这篇文章描述得太简单了,没有解释清楚抽象工厂和工厂方法区别,我还是有点疑惑。希望作者能解释一下他们的联系和作用范围。

        有11位网友表示赞同!

    温柔腔

    对工厂模式的理解还可以加强一下, 虽然文章内容详细,但对于一些更深层次的概念解释还需要更多细节的补充

        有7位网友表示赞同!

    念安я

    其实我个人比较倾向于使用Builder模式,因为我觉得它更加简洁易懂而且能够更好地描述对象构建过程。当然,工厂模式也是很实用的,尤其是在需要快速创建不同产品实例的时候。

        有8位网友表示赞同!

    不浪漫罪名

    最近在学习设计模式,工厂模式确实很有用! 感觉抽象工厂比简单工厂更强大,因为它可以定义家族产品的创建规则,更加灵活

        有20位网友表示赞同!

    弃我者亡

    虽然工厂模式的确好用,但我认为过度依赖它可能会导致代码过于复杂化。 最好根据实际情况选择合适的设计模式,而不是一概而论.

        有10位网友表示赞同!

    凝残月

    这篇文章写的确实很好,我明白了工厂模式的几个简单类型,以后要多用在项目开发中

        有14位网友表示赞同!

    绳情

    学习设计模式真的很重要, 掌握了工厂模式后,可以更有效率地编写代码! 感谢作者分享这个知识点!

        有11位网友表示赞同!

    軨倾词

    我一直觉得软件工程中的很多东西都值得好好研究, 就像这个工厂模式一样。以后我要认真学习好它的具体应用场景和技巧

        有11位网友表示赞同!

    热点资讯