隔离抽象工厂这个名称或者称呼,抽象工厂实际上就是一个抽象类已而。而抽象类其实是一种介于接口和具体类的中间价态(化学上的名称~\(≧▽≦)/~啦啦啦),是一种纯抽象和纯实现这两极的中庸之道。
前提:子类中如果有共同的部分(如:方法DaoFactory getInstance(String classname)),那么我们就可以把它提取出来放在抽象类中,而不是每一个子类都要来写这个方法,提高了重复性,也便于扩展子类。而且它们还有相同的方法名称,但是实现不一样,可以定位抽象方法 abstract IuserDao getuserdao(); abstract IroleDao getroledao();看来我们构造一个抽象类非常的合情合理啊!
构建抽象类的线索:子类中有公共的实现部分,而且有抽象方法部分以供不同子类的实现,那么看来我们构造一个抽象类非常的合情合理啊!
我们的子类继承自抽象类而不直接实现接口,是因为接口是完全抽象的,我们的子类每实现一次都要完全覆盖接口中的方法;而抽象类可以有实现,那么我们的子类就不必重写那些公共的部分咯(如:方法DaoFactory getInstance(String classname)),而且扩展起子类也比较容易。
[color=olive]大纲图[/color]
[img]http://dl.iteye.com/upload/picture/pic/77153/ffff661a-ec09-344c-8bf0-72b00ec28a14.jpg[/img]
[color=olive]UML图[/color]
[img]http://dl.iteye.com/upload/picture/pic/77151/db66f5af-a6dc-30d2-8baa-a3db57fd0cff.jpg[/img]
前提:子类中如果有共同的部分(如:方法DaoFactory getInstance(String classname)),那么我们就可以把它提取出来放在抽象类中,而不是每一个子类都要来写这个方法,提高了重复性,也便于扩展子类。而且它们还有相同的方法名称,但是实现不一样,可以定位抽象方法 abstract IuserDao getuserdao(); abstract IroleDao getroledao();看来我们构造一个抽象类非常的合情合理啊!
构建抽象类的线索:子类中有公共的实现部分,而且有抽象方法部分以供不同子类的实现,那么看来我们构造一个抽象类非常的合情合理啊!
我们的子类继承自抽象类而不直接实现接口,是因为接口是完全抽象的,我们的子类每实现一次都要完全覆盖接口中的方法;而抽象类可以有实现,那么我们的子类就不必重写那些公共的部分咯(如:方法DaoFactory getInstance(String classname)),而且扩展起子类也比较容易。
[color=olive]大纲图[/color]
[img]http://dl.iteye.com/upload/picture/pic/77153/ffff661a-ec09-344c-8bf0-72b00ec28a14.jpg[/img]
[color=olive]UML图[/color]
[img]http://dl.iteye.com/upload/picture/pic/77151/db66f5af-a6dc-30d2-8baa-a3db57fd0cff.jpg[/img]
package zen.factory;
/*来源:http://zhidao.baidu.com/question/63058512.html
*
* 以开发项目的DAO层为例,在项目中客户的需求是常常变动的,
* 临时更换数据库的需求也是常常发生的,
* 那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.
* 工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列)
*
* */
//角色表DAO接口
interface IroleDao {
void insert();
void update();
}
// 用户表DAO接口
interface IuserDao {
void find();
void delete();
}
// 用户表Oralce数据库DAO
class OracleuserDao implements IuserDao {
public void delete() {
System.out.println("Oralce 删除用户表数据");
}
public void find() {
System.out.println("Oralce 查询用户表数据");
}
}
// 用户表MySql数据库DAO
class MySqluserDao implements IuserDao {
public void delete() {
System.out.println("MySql 删除用户数据");
}
public void find() {
System.out.println("MySql 查询用户数据");
}
}
// 角色表Oracle数据库DAO
class OracleroleDao implements IroleDao {
public void insert() {
System.out.println("Oralce 对角色表插入数据");
}
public void update() {
System.out.println("Oracle 对角色表更新数据");
}
}
// 角色表MySql数据库DAO
class MySqlroleDAO implements IroleDao {
public void insert() {
System.out.println("MySql 对角色表插入数据");
}
public void update() {
System.out.println("Mysql 对角色表更新数据");
}
}
// DAO抽象工厂
abstract class DaoFactory {
public static DaoFactory getInstance(String classname) {
DaoFactory dao = null;
try {
dao = (DaoFactory) Class.forName(classname).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return dao;
}
abstract IuserDao getuserdao();
abstract IroleDao getroledao();
}
// Oralce工厂
class OracleFactory extends DaoFactory {
public IroleDao getroledao() {
return new OracleroleDao();
}
public IuserDao getuserdao() {
return new OracleuserDao();
}
}
// MySql工厂
class MysqlFactory extends DaoFactory {
public IroleDao getroledao() {
return new MySqlroleDAO();
}
public IuserDao getuserdao() {
return new MySqluserDao();
}
}
class Config {
static final String ORALCE = "zen.factory.OracleFactory";
static final String MYSQL = "zen.factory.MysqlFactory";
}
public class DBFactory {
public static void main(String[] args) {
DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
}
}
输出结果:
Oralce 对角色表插入数据
MySql 对角色表插入数据