反射与工厂设计模式
- 具体内容
工厂设计模式曾经给过一个原则:
如果是你自己所编写的接口要想取得本接口的实例化对象最好使用工厂类来设计。
但是也需要知道传统工厂设计所带来的问题。
范本:编写一个传统的工厂类
public void eat() ;
}
class Apple implements Fruit {
@override
public void eat() {
System. out . println(" [Applel吃苹果。");
}
}
class Factory {
private Factory() {}
public static IFruit getInstance(String className) {
if ("apple" . equals(className)) {
return new Apple() ;
}
return nu11 ;
}
public static void main(String[] args) throws Exception
IFruit fruit.=Factorry.getnstace("pple") ;
fruit.eat();
但是非常遗憾的问题是:
该工厂设计类在开发中根部就不可能使用
- 传统工厂设计模式
范例:修改工厂类
所以传统工厂类最大的弊端:
关键字new。那么如果要想去解决关键字new所带来的问题,最好的做法就是通过反射来完成处理,因为Class类可以使用newInstance()实例化对象,同时Class.forName()能够接收String这个类名称。
范例:修改程序
object obj = class.forName(className ).newInstance
}catch j(InstantiationException e) i
// ToDo Auto-generated catch block
e.printstackTrace();
}catch (IllegalAccessException e) i
/ /ToDo Auto-generated catch block
e.printstackTrace();
}catch (classNotFoundException e) i
/ / ToDo Auto-generated catch block
e.printstackTrace();
)
return fruit ;
所以现在可以发现,通过反射类改进的工厂设计模式,其最大的特征在于:可以方便动态进行子类的扩充操作。而关键字new会造成耦合问题。
但是以上的程序依然存在有缺陷:
如果说现在有十万个接口,那么按照此类模式就意味着需要有十万个工厂,而十万个工厂完成的都是相同的功能。这2个就浪费了,所以可以使用泛型来解决当前的问题。
范例:通过泛型来处理
package cn.mldn.demo;
interface IFruit i
Ipublic void eat() ;
}
interface IMessage i
public void print() ;
}
class MessageImpl implements IMessage {
=@override
public void print( i
system.out.printin( "www. mldn.cn" ) ;
从实际的开发来讲,工厂类上使用泛型之后,就可以更好地为更多的接口进行服务了。
- 总结
在实际开发之中如果可以掌握这种泛型和反射的组合操作原则,那么对于整体的一个代码你就可以编写出高可用的程序了。