參考:反射例子
內(nèi)容
- 工廠模式
- 增加反射來提高靈活性
- 增加配置文件進(jìn)一步優(yōu)化
代碼實(shí)現(xiàn)
實(shí)體類
public interface ISleep {
String sleep();
}
public class CatSleep implements ISleep {
@Override
public String sleep() {
return "cat xiaohu is sleeping!";
}
}
public class DogSleep implements ISleep {
@Override
public String sleep() {
return "dog qiqi is sleeping!";
}
}
基本的抽象工廠
/**
* 簡單工廠
*/
public class NormalFactory {
public static ISleep getSleepObject(String tag) throws IllegalArgumentException{
if (TextUtils.equals(tag,"cat")){
return new CatSleep();
}else if (TextUtils.equals(tag,"dog")){
return new DogSleep();
}else {
throw new IllegalArgumentException("wrong argument!");
}
}
}
增加反射來優(yōu)化
/**
* 利用反射來優(yōu)化
*/
public class ReflectFactory {
public static ISleep getSleepObject(String className) throws IllegalArgumentException{
ISleep iSleep = null;
try {
iSleep =(ISleep) Class.forName(className).newInstance();
}catch (Exception e){
throw new IllegalArgumentException("wrong class name");
}
return iSleep;
}
}
增加配置文件來優(yōu)化(讀取本地文件等窥浪,這里模擬下)
/**
* 從配置文件讀取: 這里簡單模擬下
*/
public class ConfigFactory {
private static HashMap<String ,String> map;
public static String path = "com.pq.toolslibrary.factoryOptimize.interfaces.";
static {
map = new HashMap<>();
map.put("cat",path+"CatSleep");
map.put("dog",path+"DogSleep");
}
public static ISleep getSleepObject(String tag) throws IllegalArgumentException{
ISleep iSleep = null;
try {
iSleep =(ISleep) Class.forName(map.get(tag)).newInstance();
}catch (Exception e){
throw new IllegalArgumentException("wrong class name");
}
return iSleep;
}
}
使用:
public class FactoryUtil {
public static String demo(){
StringBuilder stringBuilder = new StringBuilder("工廠模式的優(yōu)化:").append("\n");
stringBuilder.append("優(yōu)化前: ").append("\n")
.append(NormalFactory.getSleepObject("cat").sleep()).append("\n")
.append("反射優(yōu)化").append("\n")
.append(ReflectFactory.getSleepObject(ConfigFactory.path+"DogSleep").sleep()).append("\n")
.append("配置優(yōu)化").append("\n")
.append(ConfigFactory.getSleepObject("dog").sleep());
return stringBuilder.toString();
}
}