抽象工厂模式简单实例

创建型设计模式实训,利用抽象工厂模式实现不同数据库连接。要求按照P102页6.3.2实例说明,实现类图代码,并且编写测试客户端,给出动态更换数据库的运行结果。

  1. DBFactory

//定义抽象工厂类
public interface  DBFactory {
    //定义工厂方法 每一个产品对应的产品族定义一个工厂方法
    public Connection  createConnection();//定义createConnection方法
    public  Statement createStatement();//定义createStatement方法
}

  1. Connection

//抽象产品类Connection

public interface Connection {
    public void connect();//业务方法connect的声明

}

  1. Statement

//抽象产品类Statement
public interface Statement {
    public void stat();//声明业务方法stat
}

  1. MysqlFactory

//具体工厂类MysqlFactory
public class MysqlFactory implements DBFactory{
    @Override
    public Connection createConnection() {
        return new MysqlConnection();//实现DBFactory定义的工厂方法,用于创建具体产品对象 connection
    }

    @Override
    public Statement createStatement() {
        return new MysqlStatement();//实现DBFactory定义的工厂方法,用于创建具体产品对象 Statement
    }
}

  1. OracleFactory

//具体工厂类OracleFactory
public class OracleFactory implements DBFactory{

    @Override
    public Connection createConnection() {
     return new OracleConnection();//实现DBFactory定义的工厂方法,用于创建具体产品对象 connection
    }

    @Override
    public Statement createStatement() {
        return new OracleStatement();//实现DBFactory定义的工厂方法,用于创建具体产品对象 Statement
    }

}

  1. MysqlConnection

//具体产品类MysqlConnection
public class MysqlConnection implements Connection{
    @Override
    public void connect() {
        System.out.println("mysql connect");//实现了在Connection定义的方法connect
    }
}

  1. MysqlStatement

//具体产品类MysqlStatement
public class MysqlStatement implements Statement {
    @Override
    public void stat() {
        System.out.println("Mysql statement");//实现了在Statement定义的方法stat
    }
}

  1. OracleConnection

//具体产品类OracleConnection
public class OracleConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("oracle connection");//实现了在Connection定义的方法connect
    }
}

  1. OracleStatement

//具体产品类OracleStatement
public class OracleStatement implements Statement{

    @Override
    public void stat() {
        System.out.println("oracle statement");//实现了在Statement定义的方法stat
    }
}

  1. XMLUtil

import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;


public class XMLUtil {
public static Object getBean() {
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
//获取包含charType类型的文本节点,此处可以改为className
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue() ;
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}

  1. Test类

    public class Test {
    public static void main(String args[]) {
    DBFactory factory;
    Connection con;
    Statement stat;
    factory=(DBFactory)XMLUtil.getBean();
    con=factory.createConnection();
    con.connect();
    stat=factory.createStatement();
    stat.stat();
    }

    }

  • 运行结果截图
  1. OracleFactory

  1. MySQLFactory

  

  

五.设计模式分析总结

     抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下

可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。

当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。

抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。

其缺点是:

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。

你可能感兴趣的:(java)