为了实现更好的灵活性
应改面向接口编程。因此,应该面向接口提供工场。
比如,Cat, Dog, Mouse,都是4条腿会跑的动物。
因此,我们建立一个接口叫做FourLegs
interface FourLegs {
void run();
}
我们可能需要一个实验使用一个会跑得动物
比如,我们要一个发电机,但是不管什么
只要会跑得动物都可以来发电
class ElectricProducer {
void produceBy(FourLegs fourLegs){
...dosomething..
fourLegs.run();
}
}
我们需要一个工场来管理动物的创建,因为有可能增加很多动物。
OCP原则,就是说,对类的扩展要open类,对类的修改要close
class FourLegFactory{
FourLegFactory factory() {
return ...
}
}
这里面factory的实现可以是通过配置文件,也可以是通过参数等等
反正是产生了一个Cat,Dog或者Mouse的实例。这我们不关注是什么
Client代码{
FourLeg fourLeg = FourLegFactory.factroy();
ElectricProducer.produceBy(fourLeg)
}
这样我们的发电机正常运作了
而且通过修改某种系统设置,可以更换任何一种动物来帮忙发电
试想,如果我们用FourLeg fourLeg = new Mouse();
那么一旦许要换成Cat,还需要修改Client的代码。
这就是simple factory
原文:http://www.cnblogs.com/min10/archive/2008/10/17/1313632.html
下面是另一篇相关的文章:
去年“面向对象程序设计”课程的最后一道大题是用“类工厂”模式实现一个数据库组件。“类工厂”的类里对于不同数据库类型的处理是用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这个字符串。
地址:http://blog.163.com/wu_qihui/blog/static/91489033201106103241593/
问题:如果某个接口被多个对象实现,那么如何动态实例化对象?