【设计模式】工厂方法模式

❓首先什么是设计模式?

😵相信刚上大学的你和我一样,在学习这门课的时候根本不了解这些设计原则和模式有什么用处,反而不如隔壁的C++更有意思,至少还能弹出一个小黑框,给我个hello world。

✨ 如何你和我一样也是这么想,那接下来咱们以贴合生活实际 的方式来看看设计模式 到底有什么神奇的地方

😄更多有趣的设计模式讲解都在设计模式👍专栏,欢迎来看看🎉🎉🎉。

【设计模式】工厂方法模式

前言

在前面的博客中我们已经简单介绍了什么是简单工厂模式,需要详细了解的可以看一下这个博客 》【设计模式】简单工厂模式

另外,简单总结一下简单工厂,其实就是将复杂的创建对象的流程封装到一个类中,我们称之为工厂,然后由该工厂实现对象的创建,从而将对象创建和对象使用分割开来。

但是,简单工厂是有它的局限性的。当需要创建新一类 对象时,我们需要修改原来的工厂类(注意,这里不是创建新对象,是需要创建新一类对象,就比如原来可以创造A类对象,现在需要创造B类对象,就必须要修改工厂类)。

那有什么办法可以解决吗,没错,就是我们的工厂方法模式。

工厂方法模式

现在总结下我们的需求

  • 可以动态增加创建对象的类别
  • 不需要修改原工厂类

这时候你有没有什么解决方法?

是不是有一个很简单的方式,就是直接再创建一个工厂类就好了嘛,然后使用该工厂来创建新类别的对象

这个路子是不是很简单,感觉非常合理,但是否真的合理呢?

六大原则分析

我们从六大原则入手开始考虑

首先是开闭原则 ,没毛病,支持添加新工厂类和对象类,而且还没修改原来的代码。

里氏代换

好像有点问题了,没有父类呀,这俩工厂类并没有关系(当然硬说的话都是object的子类,暂不考虑这个,因为覆盖面太广了,实际操作没有太大意义)。

那想一下,为什么要满足里氏代换呢,也就是父类可以直接引用子类,然后直接使用子类的功能呢?

试想一下这样的功能哈

现在我们有一个造宝马的工厂,工厂类和产品定义如下所示

java 复制代码
 class BMWProduct {
        
    }


    class BMWFactory{
        public Product create() {
            return new BMWProduct();
        }
    }

这个时候,我们需要通知这个工厂去造车,然后再进行后续的一些工作,如下所示

java 复制代码
  void test() {
//      创建工厂
        BMWFactory factory = new BMWFactory();
//      造车
        Product car = factory.create();
//      刷漆,贴膜和加配等操作,这里就不写了,就是对car进行美化,或调用car的方法

    }

现在需求来了,我们不仅需要通知BMW工厂造车,我们还需要通知XM工厂去造车,如果现在这种代码逻辑的话,我们是不是需要再去写一边test方法,因为你不能保证XM车能调用的方法和BMW车能调用的方法一致

这个时候,你会发现,你又多写了一遍test方法

但如果使用工厂方法呢

java 复制代码
 abstract class Product {

    }

    interface Factory {
        Product create();
    }

    class BMWProduct extends Product {

    }


    class BMWFactory implements Factory {

        @Override
        public Product create() {
            return null;
        }
    }


    void test() {
//      创建工厂
        Factory factory = new BMWFactory();
//      造车
        Product car = factory.create();
//      刷漆,贴膜和加配等操作


    }

你会发现,我们使用Factory来接受具体的造车工厂,这样我们如果需要XM工厂造车的话,我们只需要把test中的BMWFactory换成XMFactory就可以了,如下

java 复制代码
    void test() {
//      创建工厂
        Factory factory = new XMFactory();
//      造车
        Product car = factory.create();
//      刷漆,贴膜和加配等操作


    }

这样效率是不是就上来了

现实工作中的应用

如果你现在需要创建多个对象,并且多个对象的具体实现并不相同,基于创建的对象还要执行相同的操作,可以采用该模式,这样可以保证你后期维护时,只需要添加工厂对象和产品对象,并不需要修改原有的逻辑,以免出现问题。

并且很适合给新手进行扩展

如果我们提供的方法没有很好的扩展性,新手可能需要对原逻辑代码进行修改,出错概率极高。

采用这种方式可以避免很多问题的发生。

问题

观察上面的方法,你会发现很好解决了造多种车的需求

但如果现在我需要车厂造车的时候,顺便把车膜也给我整出来,那咋弄呢

我们现在的方法,一个工厂只能造一类产品,肯定不行

那有没有解决方案呢?

也就是我们之后要讲的抽象工厂模式

总结

先写到这里,抽象工厂很快更新

相关推荐
白鲸开源14 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole14 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫14 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide15 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户37215742613515 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源15 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
晨米酱16 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
Java中文社群16 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心16 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧16 小时前
Spring Boot项目中如何自定义线程池
java