《研磨设计模式》一书总提到简单工厂模式,缺点:如果增加实现类,就要修改工厂类。提到一种解决方案:使用配置文件;FactoryTest.properties:
ImplClass=factory.Impl1Api:package factory;public interface Api { 
public void test1(String s);
}
Impl1:package factory;public class Impl1 implements Api{public void test1(String s) {
System.out.println("测试1:"+s);
}}
factory:
package factory;import java.io.InputStream;
import java.util.Properties;public class Factory {
public static Api createApi(){
Properties p = new Properties();
InputStream in = null;
try {
in = Factory.class.getResourceAsStream("FactoryTest.properties");
p.load(in);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}Api api = null;
try {
api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance(); } catch (Exception e) {
e.printStackTrace();
}
return api;
}
}
Client
package factory;public class Client {
public static void main(String[] args) {
Api api = Factory.createApi();
api.test1("Hello...");
}
}但是我有两个实现类呢?客服端怎么判断?Impl2:
package factory;public class Impl2 implements Api{public void test1(String s) {
System.out.println("测试2:"+s);
}}FactoryTest.properties:是不是要写成:
ImplClass=factory.Impl1
ImplClass2=factory.Impl2
但这里还是要修改啊。
api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance();向java神求解!!!
在线等!!!!!!!! 

解决方案 »

  1.   

    Api api = Factory.createApi();
    你可以改成 Api api = Factory.createApi("ImplClass2");传参数的方式来获取对应的API
      

  2.   

    FactoryTest.properties 该文件中有两个属性,分别为:
    ImplClass=factory.Impl1
    ImplClass2=factory.Impl2
    首选你要确定的是,你要有几个 ImplClass,然后全部都需要实例化呢? 还是要实例化多个ImplClass中的一个?看你的回复, 应该是实例化一个, 具体实例化哪一个,这个自然是要靠个条件来判断,自然是需要客服端传参数过来,当然该参数不一定是类的路径或是配置文件中属性的名称我的猜测,因为还是不太明白你的具体需求
    其实只需要一个ImplClass, 然后在ImplClass中的Test方法中,接受参数,根据不同的参数做不同的事情也可以,毕竟你实例化多个ImplClass,本质上功能还是一样的所以没必要实例化多个