接口
public interface IService {
String getName();
}
实现类
package com.icodesoft.service;
public class UserService implements IService {
@Override
public String getName() {
return "User Service";
}
}
package com.icodesoft.service;
public class ProductService implements IService {
@Override
public String getName() {
return "Product Service";
}
}
工厂类
public class FactoryService {
private FactoryService(){}
// 普通写法
public static IService getService(String key) {
if ("user-service".equals(key)) {
return new UserService();
} else if ("product-service".equals(key)) {
return new ProductService();
} else {
return null;
}
}
// 稍作改进
public static IService getInstance(String className) {
try {
Class<?> clzz = Class.forName(className);
IService instanceService = (IService) clzz.newInstance();
return instanceService;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
public class Factory {
private Factory() {}
// 推荐写法
public static <T> T getInstance(String className) {
try {
Class<?> clzz2 = Class.forName(className);
T instanceService = (T) clzz2.newInstance();
return instanceService;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
测试类
import com.icodesoft.service.Factory;
import com.icodesoft.service.FactoryService;
import com.icodesoft.service.IService;
public class DemoApplication {
public static void main(String[] args) {
String key = "user-service";
IService userService = FactoryService.getService(key );
System.out.println("**************FactoryService.getService************** Service Name: " + userService.getName());
key = "product-service";
IService productService = FactoryService.getService("product-service");
System.out.println("**************FactoryService.getService************** Service Name: " + productService.getName());
String className = "com.icodesoft.service.UserService"; // 从配置文件中获取
userService = FactoryService.getInstance(className);
System.out.println("**************FactoryService.getInstance************** Service Name: " + userService.getName());
userService = Factory.<IService>getInstance("com.icodesoft.service.UserService");
System.out.println("**************Factory.<IService>getInstance************** Service Name: " + userService.getName());
className = "com.icodesoft.service.ProductService"; // 从配置文件中获取
productService = FactoryService.getInstance(className);
System.out.println("**************FactoryService.getInstance************** Service Name: " + productService.getName());
productService = Factory.<IService>getInstance(className );
System.out.println("**************Factory.<IService>getInstance************** Service Name: " + productService.getName());
}
}