工厂模式
- 告诉工厂类,我需要什么,工厂类就会为我提供什么;工厂模式就是典型的面向接口编程,最大化的降低了编码的耦合性。
简单工厂模式
简单工厂模式比较简单,也是项目中可能会经常用到的一种设计模式。比如,我们在开发时,我们会有不同的库,比如:线下开发环境数据库,预发环境数据库,生产环境数据库。如果不通过工厂模式,我们每次切换环境时,都需要手动改动相关的数据库连接代码,此时代码就产生了严重的耦合。而我们使用简单工厂模式,就可以极大的降低这种耦合,编写的代码如下:
定义一个连接数据库的接口
/**
* 定义一个连接数据库的接口。
* @author wushuaiping
* @date 2018/3/11 下午2:09
*/
public interface DatabaseConnection {
/**
* 连接数据库。
*/
void connection();
}
再编写不同环境的数据库连接代码实现它
连接线下环境数据库的实现类
/**
* 连接线下环境数据库
* @author wushuaiping
* @date 2018/3/11 下午2:34
*/
public class DailyConnection implements DatabaseConnection {
public void connection() {
// 这里是连接线下数据库的相关逻辑
System.out.println("日常环境连接成功...");
}
}
连接预发环境数据库的实现类
/**
* 连接预发环境数据库
* @author wushuaiping
* @date 2018/3/11 下午2:39
*/
public class PreConnection implements DatabaseConnection {
public void connection() {
// 连接预发环境数据库的逻辑代码
System.out.println("预发环境连接成功...");
}
}
连接线上环境数据库的实现类
/**
* 连接线上环境数据库
* @author wushuaiping
* @date 2018/3/11 下午2:42
*/
public class ProConnection implements DatabaseConnection {
public void connection() {
// 连接线上环境数据库的逻辑
System.out.println("线上环境连接成功...");
}
}
编写一个工厂类
/**
* 数据库环境选择工厂类
* @author wushuaiping
* @date 2018/3/11 下午2:43
*/
public class ConnectionFactory {
public static final String ENV = "env";
public static final String PRE = "pre";
public static final String PRO = "pro";
/**
* 选择连接数据库
* @param env
* @return true: 连接成功
* false: 连接未成功
*/
public boolean connection(String env){
DatabaseConnection databaseConnection;
try {
if (ENV.equals(env)){
databaseConnection = new DailyConnection();
databaseConnection.connection();
}else if (PRE.equals(env)){
databaseConnection = new PreConnection();
databaseConnection.connection();
}else if (PRO.equals(env)){
databaseConnection = new ProConnection();
databaseConnection.connection();
}
}catch (Exception e){
return false;
}
return true;
}
}
Test Case
public class Main {
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
// 日常
factory.connection(ConnectionFactory.ENV);
// 预发
factory.connection(ConnectionFactory.PRE);
// 线上
factory.connection(ConnectionFactory.PRO);
}
}
输出
日常环境连接成功...
预发环境连接成功...
线上环境连接成功...
这样来编写代码的话,以后如果新加了数据库环境,也只需要新加一个连接类并在在工厂类中添加相关代码即可,而不用去改动其他环境中的代码逻辑。