抽象工厂模式概念:提供一个创建一系列或相互依赖对象的接口,而无需指定他们具体的类 

抽象工厂模式中的角色

  • 抽象角色
  • 具体角色
  • 抽象工厂
  • 具体工厂

 例题题目:某一系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象,如提供Oracle或SQL Server专用连接类和语句类,而且用户可以通过主函数方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计该系统。


类图:


代码实现:

一、DBFactory类(抽象工厂类):

package 抽象工厂模式;

public interface DBFactory {
    public Connection createConnection();
    public Statement createStatement();
}

 二、MySqlFactory:

package 抽象工厂模式;

public class MySqlFactory implements DBFactory{
    @Override
    public Connection createConnection() {
        return new MySqlConnection();
    }

    @Override
    public Statement createStatement() {
        return new MySqlStatement();
    }
}

三、OracleFactory:

package 抽象工厂模式;

public class OracleFactory implements DBFactory{
    @Override
    public Connection createConnection() {
        return new OracleConnection();
    }

    @Override
    public Statement createStatement() {
        return new OracleStatement();
    }
}

 四、Connection(连接类):

package 抽象工厂模式;

public interface Connection {
    public void connect();
}

五、MySqlConnection类:

package 抽象工厂模式;

public class MySqlConnection implements Connection{
    @Override
    public void connect() {
        System.out.println("连接到MySql数据库.........");
    }
}

六、OracleConnection类:

package 抽象工厂模式;

public class OracleConnection implements Connection{
    @Override
    public void connect() {
        System.out.println("连接到Oracle数据库.......");
    }
}

七、Statement(状态类):

package 抽象工厂模式;

public interface Statement {
    public void state();
}

八、MySqlStatement类:

package 抽象工厂模式;

public class MySqlStatement implements Statement{
    @Override
    public void state() {
        System.out.println("执行MySql数据库操作语句");
    }
}

 九、OracleStatement类:

package 抽象工厂模式;

public class OracleStatement implements Statement{
    @Override
    public void state() {
        System.out.println("执行Oracle数据库操作语句");
    }
}

 十、客户端:

package 抽象工厂模式;

import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入您要链接的数据库类型(mysql/oracle)");
        String DB = scanner.next();
        if(DB.equals("mysql")) {
            DBFactory factory1 = new MySqlFactory();
            Connection connect1 = new MySqlConnection();
            Statement state1 = new MySqlStatement();
            connect1 = factory1.createConnection();
            connect1.connect();
            state1 = factory1.createStatement();
            state1.state();
        } else if (DB.equals("oracle")) {
            DBFactory factory2 = new OracleFactory();
            Connection connect2 = new OracleConnection();
            Statement state2 = new OracleStatement();
            connect2=factory2.createConnection();
            connect2.connect();
            state2=factory2.createStatement();
            state2.state();
        }else{
            System.out.println("您输入的格式有误,请检查后重新输入!");
        }


    }
}

运行结果:

 

 

 本文基于题目实现的代码较为基础且创建对象过程并没有优化,耦合度较高,仅供设计模式思路参考,若欲进一步优化可以引入Spring让Spring为我们完成创建对象和引入依赖的过程。以上代码若有错误还望不吝赐教...

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐