设计模式之工厂模式

Spring Wu 192 2018-03-11

工厂模式

  • 告诉工厂类,我需要什么,工厂类就会为我提供什么;工厂模式就是典型的面向接口编程,最大化的降低了编码的耦合性。

简单工厂模式

简单工厂模式比较简单,也是项目中可能会经常用到的一种设计模式。比如,我们在开发时,我们会有不同的库,比如:线下开发环境数据库,预发环境数据库,生产环境数据库。如果不通过工厂模式,我们每次切换环境时,都需要手动改动相关的数据库连接代码,此时代码就产生了严重的耦合。而我们使用简单工厂模式,就可以极大的降低这种耦合,编写的代码如下:

定义一个连接数据库的接口

/**
 *  定义一个连接数据库的接口。
 * @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);
    }
}

输出

日常环境连接成功...
预发环境连接成功...
线上环境连接成功...

这样来编写代码的话,以后如果新加了数据库环境,也只需要新加一个连接类并在在工厂类中添加相关代码即可,而不用去改动其他环境中的代码逻辑。


# 设计模式