隔离抽象工厂这个名称或者称呼,抽象工厂实际上就是一个抽象类已而。而抽象类其实是一种介于接口和具体类的中间价态(化学上的名称~\(≧▽≦)/~啦啦啦),是一种纯抽象和纯实现这两极的中庸之道。
前提:子类中如果有共同的部分(如:方法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数据库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 对角色表插入数据
分享到:
相关推荐
工厂模式抽象类
IOS 设计模式抽象工厂实例Demo IOS 设计 模式 抽象 工厂
c++实现工厂模式,抽象工厂,c++实现工厂模式,抽象工厂
通过抽象工厂搜提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各种各样的工厂,制造出各种不同的产品。这是与博客《抽象工厂模式--GOF的23个之一》...
抽象工厂类的使用,简单的demo,方便初学者理解,设计模式。
工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。
Qt实现的抽象工厂模式,抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。
咱们假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在你的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然...
抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型...
.net抽象工厂+存储过程添加数据(详情教程) 1、web.config配置连接、数据库类型 2、创建抽象工厂、判断连接数据库, 3、在连接的数据库中继承抽象工厂,重写抽象工厂里的接口方法,返回到数据访问层。 4、在接口层...
c#三层+抽象工厂实现+类似抽象工厂反射实现 大家可以看看,很不错,顺便做个广告,希望大家愿意交流的加小弟qq 9480007, 也可以进qq群 46301976 或 76055852
vs2010实现的软件设计模式——抽象工厂,是软件工程专业学生专业技能之一
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。...这里主板的CPU插槽数要和CPU的针脚数相等,也就是说CPU对象和主板对象是有关联的,同时CPU种类和主板的种类也有很多搭配,可以
设计模式系列之抽象工厂模式
抽象工厂模式 JAVA设计模式
用反射机制改进的抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级...在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 抽象工厂模式java demo用于学习
* 在工厂方法的基础上,进一步抽象工厂类,将工厂抽象成两层,AbsFactory(抽象工厂) 和具体实现工厂子类。 * 调用者根据创建对象类型使用对应的工厂子类。 * 这样将单个的简单工厂类变成了工厂簇, 利于代码的维护...
C#实现的三层架构 + 抽象工厂类实例,结构清晰,适合初学者学习
通过抽象类中的抽象方法实现简单工厂模式。