1.定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口,抽象类,也可以是具体类。
2.问题来源:A a = new AImpl(); 此类写在客户端,直接暴露了细节。转化为 A a = Factory.createA(); 这样把工厂的一部分暴露给用户,真正类的创建
则包含在了工厂的后面,隐藏了起来。
3.真正能实现功能的是具体的实现类,这些实现类是已经做好的,并不是真的要靠简单工厂来创造出来的,简单工厂的方法无外乎是:实现了选择一个合适的实现类来使用。
所以说简单工厂方法的主要实现的功能是--选择合适的实现类来创建实例对象。方式:客户端传入参数,factory 追加判断。或者来源于配置文件。或者来源于程序运行期的某个值。
4.使用读取文件的代码实现
public interface Api {
public void operation(String s);
}
public class ImplA implements Api {
@Override
public void operation(String s) {
System.out.println("ImplA s=="+s);
}
}
public class ImplB implements Api {
@Override
public void operation(String s) {
System.out.println("ImplB s==" + s);
}
}
FactoryTest.properties ImplClass=com.pc.simplefactory.Impl.ImplB
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 (IOException e) {
System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Api api = null;
try{
api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance();
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
return api;
}
}
public class Client {
public static void main(String[] args) {
Api api = Factory.createApi();
api.operation("^^^^^^^^^^^^^");
}
}
5.简单工厂的本质---选择实现