2021-08-12

本文通过一个实际场景展示了过度使用if-else语句导致的代码维护问题,然后引出了设计模式中的工厂模式。通过抽象接口和具体实现类,将数据库连接方式的创建职责交给专门的工厂类,从而实现代码的解耦和可扩展性。此外,还提及了Java中的Consumer接口在forEach方法中的应用,强调了对常用概念深入理解的重要性。
摘要由CSDN通过智能技术生成

以不变应万变 = 设计模式>工厂模式

设想一种场景,假如公司现在要你开发一套能连接mysql,oracle等数据库的数据源连接器,你是否会这么写?

   public void connect(String type) {
        if(Objects.equals(type, "mysql")) {  //进行mysql连接
            System.out.println("进行mysql连接");
        }
        else if(Objects.equals(type, "oracle")) { //进行oracle连接
            System.out.println("进行oracle连接");
        }
        else {
            System.out.println("不支持的数据库连接方式");  //否则不支持
        }
    }

看起来似乎还不错,在同一个方法内,而且结构好像也挺清晰?OK。你写好了,产品上线了,老板夸了你,开发神速.嗯,不错!
突然有一天,客户打来电话了,和你说:“小猿啊,我们听说数据库现在很多啊,别人有的我们也得有啊,不然显得我们落后啊, 你就随便给我加10种吧”。 你拍拍手:“没问题!”
于是你写出来了

  public void connect(String type) {
        if(Objects.equals(type, "mysql")) {
            System.out.println("进行mysql连接");
        }
        else if(Objects.equals(type, "oracle")) {
            System.out.println("进行oracle连接");
        }
        else if(Objects.equals(type, "hive")){
            System.out.println("进行hive数据库连接");
        }
        else if(Objects.equals(type, "hbase")) {
            System.out.println("进行hbase数据库连接");
        }
        else if(Objects.equals(type, "pg")) {
            System.out.println("进行pg数据库连接");
        }
        else if(Objects.equals(type, "hwmpp")) {
            System.out.println("进行hwmpp数据库连接");
        }
        else if(Objects.equals(type, "hbase")) {
            System.out.println("进行hbase数据库连接");
        }
        //此处省略100w种连接方式
        else {
            System.out.println("世面上所有数据库都支持了");
        }
    }

嗯,你又写出来了,真不错,产品又上线了, 老板很开心,给你一个亲切的吻!日子一天天过去了,突然又有一天客户说,“小猿啊,mysql出新版本了啊,其他的也出了啊,你适配一下!”,于是你,在原有的基础上,又拿起键盘

  public void connect(String type) {
        if(Objects.equals(type, "mysql")) {
            if(Objects.equals(type, "mysql1.0")) {
                System.out.println("1.0");
            }
            else if(Objects.equals(type, "mysql2.0")) {
                
            }
            else if(Objects.equals(type, "mysql3.0")) {
                
            }
            else if(Objects.equals(type, "mysql3.0")) {

            }
            else if(Objects.equals(type, "mysql3.0")) {

            }
            else if(Objects.equals(type, "mysql3.0")) {

            }
            else if(Objects.equals(type, "mysql3.0")) {

            }
            else if(Objects.equals(type, "mysql3.0")) {

            }
            System.out.println("进行mysql连接");
        }
        else if(Objects.equals(type, "oracle")) {
            System.out.println("进行oracle连接");
        }
        else if(Objects.equals(type, "hive")){
            System.out.println("进行hive数据库连接");
        }
        else if(Objects.equals(type, "hbase")) {
            System.out.println("进行hbase数据库连接");
        }
        else if(Objects.equals(type, "pg")) {
            System.out.println("进行pg数据库连接");
        }
        else if(Objects.equals(type, "hwmpp")) {
            System.out.println("进行hwmpp数据库连接");
        }
        else if(Objects.equals(type, "hbase")) {
            System.out.println("进行hbase数据库连接");
        }
        //此处省略100w种连接方式
        else {
            System.out.println("世面上所有数据库都支持了");
        }

    }

又上线了,但其实你已经有点烦了, 不是吗,这么多东西!!!看起来要死了,突然客户又打来电话:“小猿啊 ”,“嘟嘟嘟” 还没等客户说完,你就挂了电话,因为你实在是恶心自己写出的东西了,不是吗,于是你乖乖的提出了辞职,并且发出来感叹:“if 当时好好写, then 还可以继续干 else if ----”
那么其实这就引入这篇文章要说的一种设计模式,工厂模式,试想一下,以不变应万变,他们其实变得只是连接的逻辑,而不变的他们都是连接方式,那么是否把不变的可以抽成一个借口呢?.


```java
//老爸
public interface ConnectMethods {
    void connnected();
}

**//有了老爸了,该生孩子了吧!**
public class MysqlConect implements ConnectMethods {  //mysql孩子
    @Override
    public void connnected() {
        System.out.println("mysqlConnect");
    }
}

public class OracleConnect implements ConnectMethods {  //oracle孩子
    @Override
    public void connnected() {
        System.out.println("oracleConnect ");
    }
}

现在好像还缺点什么?是不是这些具体的mysqlConnect还需要一个工厂来造?那其实工厂也是一个道理,不变的是工厂,变得是工厂创造的东西罢了,如下
public interface Factory {
    ConnectMethods create();
}
public class MysqlFactory implements Factory{

    @Override
    public ConnectMethods create() {
        return new MysqlConect();
    }
}
public class OracleFactoryimplements Factory{

    @Override
    public ConnectMethods create() {
        return new OracleConect();
    }
}

好了,工厂就造完了!在思考一下,我们的java的Iterable,看看里面的 Iterator iterator();方法,思考一下,似乎有什么共同点?
顺便提一嘴,在翻Iterator iterator()这个方法的时候偶然看到了这个

 default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

之前一直使用forEach,但其实没真正看过怎么实现的,Consumer<? super T> action被我逮到了,所以啊,有些习以为常的东西,似乎我们并没有那么了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值