日期:2014-05-20  浏览次数:20686 次

请教关于 简单工厂的问题 ??请java神解答!!!!
《研磨设计模式》一书总提到简单工厂模式,缺点:如果增加实现类,就要修改工厂类。

提到一种解决方案:使用配置文件;

FactoryTest.properties:
ImplClass=factory.Impl1

Api: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神求解!!!
在线等!!!!!!!! 
------解决方案--------------------
Api api = Factory.createApi();
你可以改成 Api api = Factory.createApi("ImplClass2");传参数的方式来获取对应的API
------解决方案--------------------
这样是不是会暴露给客服端一些信息呢?因为传参的话就要知道参数的意义。还是用工厂方法模式可以解决,各有各的优缺点。
------解决方案--------------------
这样是不是会暴露给客服端一些信息呢?因为传参的话就要知道参数的意义。还是用工厂方法模式可以解决,各有各的优缺点。
------解决方案--------------------
这样是不是会暴露给客服端一些信息呢?因为传参的话就要知道参数的意义。还是用工厂方法模式可以解决,各有各的优缺点。
------解决方案--------------------
FactoryTest.properties 该文件中有两个属性,分别为:
ImplClass=factory.Impl1
ImplClass2=factory.Impl2


首选你要确定的是,你要有几个 ImplClass,然后全部都需要实例化呢? 还是要实例化多个ImplClass中的一个?

看你的回复, 应该是实例化一个, 具体实例化哪一个,这个自然是要靠个条件来判断,自然是需要客服端传参数过来,当然该参数不一定是类的路径或是配置文件中属性的名称

我的猜测,因为还是不太明白你的具体需求
其实只需要一个ImplClass, 然后在ImplClass中的Test方法中,接受参数,根据不同的参数做不同的事情也可以,毕竟你实例化多个ImplClass,本质上功能还是一样的所以没必要实例化多个