面向接口编程在工厂模式下的实现
2006-05-12 15:27
309 查看
去年“面向对象程序设计”课程的最后一道大题是用“类工厂”模式实现一个数据库组件。“类工厂”的类里对于不同数据库类型的处理是用switch...case语句来实现的,但这不符合面向对象的设计原则。如:工厂里只判断了两种数据库类型,如果再增加一个数据库类型势必要改写“类工厂”的代码(即,再加一条case语句)。问题是:如何利用合理的设计方法改善这种弊端。
今天有研一的同事问起我,正好我对这个也是云里雾里。顺便问了一下高手,具体实现了出来。与大家共勉。
大的方向是利用“面向接口编程”的理论来实现。
首先,定义一个接口,接口里写了一些抽象的方法。如:得到数据库连接,根据sql语句得到结果集。
第二,定义不同数据库类型对接口中的抽象方法的具体实现的类。如:OracleAccess,SqlAccess。这些类中一定包含与上面接口中的抽象方法具有相同签名的方法。方法中有具体实现功能代码。
第三,定义“类工厂”,“类工厂”中的构造方法需要有一个入参,即,数据库类型(dbType)。还要有一个得到具体类的实例的方法。
第四,如果你不嫌麻烦,还可以写一个读取配置文件的类。当然不写也可以。
第五,编辑一个配置文件,我这里用的是.properties文件。文件中就是key和value对应的关系。如:oracle=OracleAccess。其中,value就是要返回的实例的类名称。
好了,现在看看各类的具体代码。这里为了方便起见,我用的返回不同字符串的方法。没有用数据库的操作。
1、接口:
public interface IDBAccess {
public String getString();
}
2、实现接口的具体类:
public class OracleAccess implements IDBAccess{
public OracleAccess(){
}
public String getString(){
String conn = "oracle instance";
return conn;
}
}
public class SqlAccess implements IDBAccess{
public SqlAccess(){
}
public String getString(){
return "sql instance";
}
}
3、类工厂
public class DBFactory {
private String instance;
public DBFactory(String dbType){
instance = (String)ConstantLib.getInstance().context.get(dbType);
}
public IDBAccess getInstance() throws Exception{
IDBAccess dbInstance = (IDBAccess)((Class.forName(instance)).newInstance());
return dbInstance;
}
}
4、配置文件的编辑
oracle=OracleAccess
sql=SqlAccess
5、现在可以写一个测试程序了,看看能不能运行。
public class test {
public static void main(String args[]) throws Exception{
DBFactory dbFactory = new DBFactory("sql");
IDBAccess instance = dbFactory.getInstance();
System.out.println(instance.getString());
}
}
看看能不能输出sql instance这个字符串,把工厂的入参该成oracle试试。能不能输出oracle instance这个字符串。
今天有研一的同事问起我,正好我对这个也是云里雾里。顺便问了一下高手,具体实现了出来。与大家共勉。
大的方向是利用“面向接口编程”的理论来实现。
首先,定义一个接口,接口里写了一些抽象的方法。如:得到数据库连接,根据sql语句得到结果集。
第二,定义不同数据库类型对接口中的抽象方法的具体实现的类。如:OracleAccess,SqlAccess。这些类中一定包含与上面接口中的抽象方法具有相同签名的方法。方法中有具体实现功能代码。
第三,定义“类工厂”,“类工厂”中的构造方法需要有一个入参,即,数据库类型(dbType)。还要有一个得到具体类的实例的方法。
第四,如果你不嫌麻烦,还可以写一个读取配置文件的类。当然不写也可以。
第五,编辑一个配置文件,我这里用的是.properties文件。文件中就是key和value对应的关系。如:oracle=OracleAccess。其中,value就是要返回的实例的类名称。
好了,现在看看各类的具体代码。这里为了方便起见,我用的返回不同字符串的方法。没有用数据库的操作。
1、接口:
public interface IDBAccess {
public String getString();
}
2、实现接口的具体类:
public class OracleAccess implements IDBAccess{
public OracleAccess(){
}
public String getString(){
String conn = "oracle instance";
return conn;
}
}
public class SqlAccess implements IDBAccess{
public SqlAccess(){
}
public String getString(){
return "sql instance";
}
}
3、类工厂
public class DBFactory {
private String instance;
public DBFactory(String dbType){
instance = (String)ConstantLib.getInstance().context.get(dbType);
}
public IDBAccess getInstance() throws Exception{
IDBAccess dbInstance = (IDBAccess)((Class.forName(instance)).newInstance());
return dbInstance;
}
}
4、配置文件的编辑
oracle=OracleAccess
sql=SqlAccess
5、现在可以写一个测试程序了,看看能不能运行。
public class test {
public static void main(String args[]) throws Exception{
DBFactory dbFactory = new DBFactory("sql");
IDBAccess instance = dbFactory.getInstance();
System.out.println(instance.getString());
}
}
看看能不能输出sql instance这个字符串,把工厂的入参该成oracle试试。能不能输出oracle instance这个字符串。
相关文章推荐
- 面向接口编程在工厂模式下的实现
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
- 反射 实现工厂模式 和 spring IOC 实现原理
- 简单工厂模式-C++实现
- C++实现工厂模式
- 大话设计模式(C++实现)--简单工厂模式
- 简单工厂模式——MFC计算器实现(连续操作)
- 设计模式实践-反射到所有接口实现类实践工厂方法,页面中有大量计算数据时设计实践
- 简单工厂模式及php实现
- 传智播客.net培训410抽象类简单工厂模式计算机实现
- 设计模式C++实现(1)——工厂模式
- 设计模式的C++实现 24.简单工厂模式
- php中使用接口实现工厂设计模式的代码
- 用工厂方法(Factory Method)和 单例模式(Singleton)实现抽象工厂(Abstract Factory)
- 设计模式C++实现——工厂模式
- 2010/7/30 初学设计模式、责任链实现filter、面向接口编程、策略模式修改排序算法
- python中getattr函数使用方法 getattr实现工厂模式
- 三种工厂模式的分析以及C++实现
- PHP实现工厂模式
- 23种设计模式之python实现--抽象工厂