为什么要有抽象工厂以及什么是抽象类?
隔离抽象工厂这个名称或者称呼,抽象工厂实际上就是一个抽象类已而。而抽象类其实是一种介于接口和具体类的中间价态(化学上的名称~\(≧▽≦)/~啦啦啦),是一种纯抽象和纯实现这两极的中庸之道。
前提:子类中如果有共同的部分(如:方法DaoFactory getInstance(String classname)),那么我们就可以把它提取出来放在抽象类中,而不是每一个子类都要来写这个方法,提高了重复性,也便于扩展子类。而且它们还有相同的方法名称,但是实现不一样,可以定位抽象方法 abstract IuserDao getuserdao(); abstract IroleDao getroledao();看来我们构造一个抽象类非常的合情合理啊!
构建抽象类的线索:子类中有公共的实现部分,而且有抽象方法部分以供不同子类的实现,那么看来我们构造一个抽象类非常的合情合理啊!
我们的子类继承自抽象类而不直接实现接口,是因为接口是完全抽象的,我们的子类每实现一次都要完全覆盖接口中的方法;而抽象类可以有实现,那么我们的子类就不必重写那些公共的部分咯(如:方法DaoFactory getInstance(String classname)),而且扩展起子类也比较容易。
大纲图
UML图
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数据库DAOclass OracleuserDao implements IuserDao {public void delete() {System.out.println("Oralce 删除用户表数据");}public void find() {System.out.println("Oralce 查询用户表数据");}}// 用户表MySql数据库DAOclass MySqluserDao implements IuserDao {public void delete() {System.out.println("MySql 删除用户数据");}public void find() {System.out.println("MySql 查询用户数据");}}// 角色表Oracle数据库DAOclass OracleroleDao implements IroleDao {public void insert() {System.out.println("Oralce 对角色表插入数据");}public void update() {System.out.println("Oracle 对角色表更新数据");}}// 角色表MySql数据库DAOclass 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 对角色表插入数据