以不变应万变 = 设计模式>工厂模式
设想一种场景,假如公司现在要你开发一套能连接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被我逮到了,所以啊,有些习以为常的东西,似乎我们并没有那么了解