|
现在又有一个问题,如果我们不仅卖奔驰和福特,我们还卖别的牌子的汽车,也就是说如果我们现在要扩充一个子类,就必须去修改“工厂”(class Factory),在“工厂”中在添加一个if去判断并去实例化相应的子类,例如我们想要销售丰田汽车,就必须修改“工厂”。怎样解决这个问题呢? 我们现在要解决的问题是,扩充子类,怎样不用去修改工厂:如果是用java语言来实现的话,我们自然会想到利用java的反射机制注2 , 注2:java的反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 用java的反射机制解决这个问题,那么在“工厂”中就不用if判断了,

这个时候在客户端的Car c=Factory.getCarInstance(“Benz”);中无论是输入Benz还是输入Ford都会等到正确的运行结果。完整的程序如下:
package org.chenb.factorydemo;
interface Car{
public void stock();
public void sell();
}
class Benz implements Car{
public void stock(){
System.out.println("Benz进货了………");
}
public void sell(){
System.out.println("Benz卖出了………");
}
}
class Ford implements Car{
public void stock(){
System.out.println("Ford进货了………");
}
public void sell(){
System.out.println("Ford卖出了………");
}
}
class Factory{
public static Car getCarInstance(String type){
Car c=null;
try {
c=(Car)Class.forName("org.chenb.factorydemo."+type).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return c;
}
}
public class FactoryDemo {
public static void main(String[] args) {
Car c=Factory.getCarInstance("Benz");
if(c!=null){
c.stock();
c.sell();
}else{
System.out.println("无此类型的汽车销售……");
}
}
}
这个时候,如果我们添加一个子类,比如我们除销售奔驰、福特以外,还要销售丰田、奇瑞,就不需要去修改工厂了,只要去添加一个子类即可,例如我们要销售丰田汽车了,就添加一个子类Toyota去实现汽车接口:
class Toyota implements Car{
public void stock(){
System.out.println("Toyota进货了………");
}
public void sell(){
System.out.println("Toyota卖出了………");
}
}
在客户端的Car c=Factory.getCarInstance(“Toyota”);中输入Toyota即可。 其实这也实现了面对对象设计的一个很重要的原则—开闭原则(OCP),即一个软件实体应当对扩展开放,对修改关闭。
共2页: 上一页 [1] 2 下一页
|