1 类的实例化不在工厂接口里面实例化, 而是在工厂子类里面实例化
2 使用者无需关注子类工厂里面的逻辑是怎么写的, 只需要知道我调用的这个方法能实 现什么功能, 我不管具体实现
3 需要添加新功能时, 直接添加一个相关工厂类, 进行实现
案例: sqlsession factory 工厂, 可以创建不同数据库的工厂对象, 并不代表真实就是这样写的奥
定义工厂接口, 我不管子工厂怎么实现, 我只需要知道, 我能通过这个方法, 获取到一个我想要的对象, 得到预计的结果
/**
* 抽象工厂
*/
public interface SesssionFactory {
/**
* 这个地方定义的接口即是 ‘工厂方法模式的特征’
* 由实现的子类工厂决定创建什么session
* @return
*/
SqlSession getSession();
}
/**
* 工厂抽象对象
*/
public interface SqlSession {
/**
* 执行sql
* @param sql sql
*/
void execute(String sql);
}
SqlSession 对象就是我想要获取的, 我不管他底层是什么连接, 全部由子工厂去具体完成
工厂实例1,
/**
* oracle 连接
*/
public class OracleSessionFactory implements SesssionFactory{
@Override
public SqlSession getSession() {
return new OracleSessionBean();
}
}
工厂实例2
/**
* oracle 连接
*/
public class MysqlSessionFactory implements SesssionFactory{
@Override
public SqlSession getSession() {
return new MysqlSessionBean();
}
}
两个具体工厂对象
/**
* 工厂对象, oracle 实例
*/
public class OracleSessionBean implements SqlSession {
@Override
public void execute(String sql) {
System.out.println("ORACLE 连接, 执行SQL");
}
}
/**
* 工厂对象, mysql 实例
*/
public class MysqlSessionBean implements SqlSession {
@Override
public void execute(String sql) {
System.out.println("MYSQL 连接, 执行SQL");
}
}
执行结果