为什么要有抽象工厂以及什么是抽象类?

隔离抽象工厂这个名称或者称呼,抽象工厂实际上就是一个抽象类已而。而抽象类其实是一种介于接口和具体类的中间价态(化学上的名称~\(≧▽≦)/~啦啦啦),是一种纯抽象和纯实现这两极的中庸之道。


前提:子类中如果有共同的部分(如:方法DaoFactory getInstance(String classname)),那么我们就可以把它提取出来放在抽象类中,而不是每一个子类都要来写这个方法,提高了重复性,也便于扩展子类。而且它们还有相同的方法名称,但是实现不一样,可以定位抽象方法    abstract IuserDao getuserdao();  abstract IroleDao getroledao();看来我们构造一个抽象类非常的合情合理啊!
构建抽象类的线索:子类中有公共的实现部分,而且有抽象方法部分以供不同子类的实现,那么看来我们构造一个抽象类非常的合情合理啊!

我们的子类继承自抽象类而不直接实现接口,是因为接口是完全抽象的,我们的子类每实现一次都要完全覆盖接口中的方法;而抽象类可以有实现,那么我们的子类就不必重写那些公共的部分咯(如:方法DaoFactory getInstance(String classname)),而且扩展起子类也比较容易。


大纲图

为什么要有抽象工厂以及什么是抽象类?_第1张图片


UML图


为什么要有抽象工厂以及什么是抽象类?_第2张图片


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 对角色表插入数据

你可能感兴趣的:(DAO,oracle,mysql,UML)