某系统为了改进数据库操作的性能,用户可以自定义数据库连接对象Connection和语句对象Statement,针对不同类型的数据库提供不同的连接对象和语句对象,例如提供Oracle或MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。使用抽象工厂模式设计该系统,要求绘制对应的类图并使用Java语言编程模拟实现。
类图:
实现代码:
抽象工厂databaseFactory类: public abstract class databaseFactory { public abstract Connection createConnection(); public abstract Statement createStatement();
} 具体工厂MysqlFactory 类: public class MysqlFactory extends databaseFactory { @Override public Connection createConnection() {
return new mysqlConnection(); }
@Override public Statement createStatement() {
return new mysqlStatement(); } } 具体工厂OracleFactory 类: public class OracleFactory extends databaseFactory { @Override public Connection createConnection() {
return new oracleConnection(); }
@Override public Statement createStatement() {
return new oracleStatement(); } } 抽象产品Connection 类: public class Connection { public void connection(){} }
抽象产品Statement 类: public class Statement { public void sattement(){} }
具体产品mysqlConnection 类: public class mysqlConnection extends Connection { public void connection() { System.out.println("提供MySql连接对象"); } }
具体产品mysqlStatement 类: public class mysqlStatement extends Statement{ public void sattement() { System.out.println("提供mysql语句对象"); } } 具体产品oracleConnection 类: public class oracleConnection extends Connection {
public void connection() {
System.out.println("提供oracle连接对象"); } }
具体产品oracleStatement 类: public class oracleStatement extends Statement { public void sattement() { System.out.println("提供oracle语句对象"); 工具类XMLUtil : import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File;
public class XMLUtil { //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 public static Object getBean() throws Exception { //创建DOM文档对象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document; document = documentBuilder.parse(new File("config.xml")); //获取包含类名的文本结点 NodeList nodeList = document.getElementsByTagName("databaseType"); Node databaseTypeNode = nodeList.item(0).getFirstChild(); String databaseType = databaseTypeNode.getNodeValue().trim(); //通过类名生成实例对象并将其返回 Class clazz = Class.forName(databaseType+"Factory"); Object object = clazz.newInstance(); return object; } } 客户端Main类: public class Main {
public static void main(String[] args) {
databaseFactory daFactory = null; Connection connection ; Statement statement; try { daFactory = (databaseFactory)XMLUtil.getBean(); } catch (Exception e) { e.printStackTrace(); }
if (daFactory==null){ System.out.println("未获取到对象"); }else { connection = daFactory.createConnection(); statement = daFactory.createStatement(); connection.connection(); statement.sattement(); } } }
|