public interface Service1 { void execute(); } public class Service1Impl implements Service1 { private Service2 service2; public Service1Impl(Service2 service2) { this.service2 = service2; } @Override public void execute() { System.out.println("Service1 is doing something."); service2.execute(); } } public interface Service2 { void execute(); } public class Service2Impl implements Service2 { @Override public void execute() { System.out.println("Service2 is doing something."); } } // 工廠類的實現 public class Service2Factory { public static Service2 getService2Instance() { return new Service2Impl(); } } public class Service1Factory { public static Service1 getService1Instance() { Service2 service2 = Service2Factory.getService2Instance(); return new Service1Impl(service2); } } // 測試代碼 public class Client { public void doSomething() { Service1 service = Service1Factory.getService1Instance(); service.execute(); } } -- Service1 is doing something. -- Service2 is doing something.
//簡單的服務定位器 public class ServiceLocator { private static ServiceLocator locator; // 建立 HashMap<String, Object>對象來持有這些服務對象 private Map<String, Object> services = new HashMap<String, Object>(); // 初始化容器 public static void configure() { load(new ServiceLocator()); // Service一、Service2的對象實際上是按照單例建立的 Service2 service2 = new Service2Impl(); locator.services.put("service2", service2); Service1 service1 = new Service1Impl(service2); locator.services.put("service1", service1); } private static void load(ServiceLocator serviceLocator) { locator = serviceLocator; } public static Object lookup(String serviceName) { return locator.services.get(serviceName); } public static void registerService(String name, Object service) { locator.services.put(name, service); } }
public class Client { public void doSomething() { Service1 service1 = (Service1) ServiceLocator.lookup("service1"); service1.execute(); } // 測試代碼 public static void main(String[] args) { // 初始化容器 ServiceLocator.configure(); new Client().doSomething(); } }
// ServiceAware 接口 public interface ServiceAware { void injectService(Service service); } // Service 接口及其實現類 public interface Service { void excute(); } public class ServiceImpl implements Service { @Override public void excute() { System.out.println("Service is doing something..."); } } // 建立簡單的接口注入容器 public class InterfaceInjector { private static InterfaceInjector injector; private Map<Class, Object> services = new HashMap<Class, Object>(); // 安裝容器 public static void configure() { load(new InterfaceInjector()); } public static <T> T getInstance(Class<T> clazz) { return injector.loadService(clazz); } private static void load(InterfaceInjector container) { InterfaceInjector.injector = container; } private <T> T loadService(Class<T> clazz) { Object service = injector.services.get(clazz); if (service != null) { return (T) service; } try { // 建立 clazz類實例 service = clazz.newInstance(); // 經過接口裝配依賴的對象,若是對象是 ServiceAware的實例爲真 if (service instanceof ServiceAware) { // 則調用此接口的方法注入 ServiceAware對象 ((ServiceAware) service).injectService(new ServiceImpl()); } injector.services.put(clazz, service); } catch (Exception e) { e.printStackTrace(); } return (T) service; } } // 只要服務類實現這個接口,容器就會注入 Service對象,定義一個 Client類實現該接口 public class Client implements ServiceAware { private Service service; @Override public void injectService(Service service) { this.service = service; } public void doSomething() { service.excute(); } public static void main(String[] args) { InterfaceInjector.configure(); Client client = InterfaceInjector.getInstance(Client.class); client.doSomething(); } } -- Service is doing something...
//參數注入 public class Client { // 外部程序經過函數參數,給客戶程序注入所依賴的服務對象 // 採用外部傳遞 Service對象方式,至於Service如何實例化,它一無所知 public void dosomething(Service service) { service.excute(); } // 使用方法:外部程序實例化一個 Service實例,傳遞給 Client的 dosomething(Service service)方法使用 public static void main(String[] args) { Service service = new ServiceImpl(); new Client().dosomething(service); } }