简单工厂的定义
提供创建实例的功能,而无需关心具体实现。
简单工厂的本质
选择实现。
简单工厂的优缺点
优点
帮助封装。客户端可以更好的面向接口编程。
解耦。客户端不需要知道实现类。
缺点
需要理解参数的意义,增加复杂度。
不方便扩展子类。
简单工厂的使用场景
想要隔离具体实现,让客户端只通过接口操作。
想要把创建对象的职责集中管理和控制。
示例1 根据参数选择
不足: 需要明白参数的意义,选择对应的实例。
public interface Api {
void operation();
}
public class ApiImplA implements Api {
@Override
public void operation() {
System.out.println("operation A");
}
}
public class ApiImplB implements Api {
@Override
public void operation() {
System.out.println("operation B");
}
}
public class Factory {
public static Api createApi(int type) {
Api api = null;
if (type == 1) {
api = new ApiImplA();
} else {
api = new ApiImplB();
}
return api;
}
}
public class TestClient {
public static void main(String[] args) {
Api api = Factory.createApi(1);
api.operation();
}
}
示例2 读取配置文件
SimpleFactory.properties
ImplClass=org.baozi.sf.ApiImplB
public interface Api {
void operation();
}
public class ApiImplA implements Api {
@Override
public void operation() {
System.out.println("operation A");
}
}
public class ApiImplB implements Api {
@Override
public void operation() {
System.out.println("operation B");
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Factory {
public static Api createApi() {
//加载Properties文件
Properties properties = new Properties();
try(InputStream in = new FileInputStream(new File("/Users/baozi/dev/workspace-idea-private/gof/src/main/resources/SimpleFactory.properties"))){
properties.load(in);
} catch (IOException e) {
System.out.println("加载配置文件出错");
e.printStackTrace();
}
//使用反射创建对象
Api api = null;
try {
api = (Api) Class.forName(properties.getProperty("ImplClass")).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return api;
}
}
public class TestClient {
public static void main(String[] args) {
Api api = Factory.createApi();
api.operation();
}
}