工厂模式核心
提供一个创建对象的功能,不需要关心具体实现
直接上代码
public class UserInfo {
private String name;
private int age;
public UserInfo() {
}
public UserInfo(String name) {
this.name = name;
}
public UserInfo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
创建了一个javaBean,这里面重载了3个构造方法,方便之后实例化
工厂模式不需要关心具体实现,只需要拿到最终结果就行了,我们拿实例化UserInfo进行举例,创建一个结构
public interface Api {
UserInfo create();
}
实现该接口
public class ApiImpl_A implements Api{
@Override
public UserInfo create() {
UserInfo userInfo = new UserInfo("lyb");
Log.e("lyb==========",userInfo.toString());
return userInfo;
}
}
public class ApiImpl_B implements Api{
@Override
public UserInfo create() {
UserInfo userInfo = new UserInfo("lyb",29);
Log.e("lyb==========",userInfo.toString());
return userInfo;
}
}
可以看到上面两个实现类,重载了不同的构造方法,假设来说实现类A是老的代码实现方式,而新的代码中该实现类已经不满足需求了,如何进行改变呢,所以我们创建工厂的时候可以根据参数的不同,调用不同的实现方式
public class SampleFactory {
public static Api createApi(int type){
switch (type){
case 1:
return new ApiImpl_A();
case 2:
return new ApiImpl_B();
}
return null;
}
}
直接调用就可以了
Api api = SampleFactory.createApi(1);
if (api != null) api.create();
以上是一种实现方式,如果使用配置文件该如何实现呢,请继续往下看
在assets里创建一个配置文件起名叫做config.properties里面定义2个键值对例如
create_a=huaan.com.mvvmdemo.ApiImpl_A
create_b=huaan.com.mvvmdemo.ApiImpl_B
来看factory的写法
public static Api createApi(Context mContext){
try {
Properties props = new Properties();
// 如果配置文件放入了app/src/main/assets文件中
InputStream inputStream = mContext.getAssets().open("config.properties");
// 如果配置文件放入了 app/src/main/res/raw 文件中
// InputStream inputStream = mContext.getResources().openRawResource("config.properties")
// java 写法
// InputStream inputStream = SampleFactory.class.getResourceAsStream("assets/config.properties");
props.load(inputStream);
Class clazz = Class.forName(props.getProperty("create_a"));
return (Api) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
同上,直接调用就好了
直接调用就可以了
Api api = SampleFactory.createApi(this);
if (api != null) api.create();
感谢
感谢大家的阅读 点个赞呗
关注我 持续更新