简单工厂的本质:选择实现
package com;
public interface Api {
void opreation(String s);
}
package com.impl;
import com.Api;
public class ImplA implements Api {
@Override
public void opreation(String s) {
System.out.println("我是A的实现:" + s);
}
}
package com.impl;
import com.Api;
public class ImplB implements Api {
@Override
public void opreation(String s) {
System.out.println("我是B的实现:" + s);
}
}
import com.Api;
import com.impl.ImplA;
import com.impl.ImplB;
public class Factory {
public static Api createApi(String which){
Api api= null;
if("A".equals(which)){
api = new ImplA();
}else if("B".equals(which)){
api = new ImplB();
}
return api;
}
}
public class Client {
public static void main(String[] args){
Factory.createApi("A").opreation("SHIXIN");
Factory.createApi("B").opreation("AXUE");
}
}
简单工厂方法的内部主要实现的功能是“选择合适的实现类”来创建实例对象。既然要实现选择,那么就需要选择的条件或者是选择的参数,选择条件爱你或者是参数的来源通常有以下几种:
1 来源于客户端,有Client来传入参数(上例即是)
2 来源于配置文件,从配置文件获取用于判断的值,优点:新增加实现类不用修改工厂类
3 来源于程序运行期的某个值,比如从缓存中获取某个运行期的值
第2种,配置文件用最简单的Properties文件,实际开发中多是xml配置。定义一个名称为“bean.properties”的配置文件,放置到Factory同一个包下面,内容如下:
implA = com.impl.ImplA
implB = com.impl.ImplB
则Factory代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.Api;
public class Factory {
public static Api createApi(String which){
Properties p = new Properties();
InputStream in = null;
try{
in = Factory.class.getResourceAsStream("bean.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(which)).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return api;
}
}
Client代码如下:
public class Client {
public static void main(String[] args){
Factory.createApi("implA").opreation("SHIXIN");
Factory.createApi("implB").opreation("AXUE");
}
}
简单工厂的特点:封装、解耦