【04】创建型-小结-IOC应用

1、上下文及问题

     使用工厂方法为每一个类创建工厂,容易造成工厂泛滥,可以采用静态工厂的方法(前例中使用泛型传递class参数产生实例的就是静态工厂)。但是对象之间的关联关系可能存在嵌套、关联等复杂关系,容易产生循环依赖。


2、常见场景

(1)IOC容器


3、解决方式

(1)Service Locator(服务定位器)方式实现IOC

      Service Locator封装了查找逻辑,为整个应用组件/服务/对象的获取提供了单一的入口。对比工厂方法,工厂方法只提供特定类型的实例化,如果一个工厂能提供所有组件/服务/对象的装配和实例化,那它就进化为服务定位器。

(2)Dependency Injection(依赖注入)实现IOC

      外部程序把服务对象通过某种方式注入到客户端,供其使用的方式,称之为依赖注入。依赖注入是从应用程序的角度去描述,应用程序依赖容器创建并注入它所需要的外部资源。


4、IOC定义

     IOC: inversion of control,

    A、谁控制谁:IoC/DI控制对象

    B、控制什么:主要是控制对象实例的创建

    C、为何叫反转:反转是相对于正向而言的,即若A里面要用到C,他不是主动去创建C,而是被动等待容器给他提供一个C的实例,反向注入给A。

    模板方法就是IOC的一个很好的应用,让通用的东西在父类实现,个性化的东西在子类或函数里头实现。


5、代码示例

(1)Service Locator示例

import java.util.HashMap;
import java.util.Map;

/**
 * Date: Nov 21, 2010
 * Time: 1:59:55 PM
 *|| */
public class ServiceLocator {
    private static ServiceLocator locator;
    private Map<String,Object> services = new HashMap<String,Object>();

    public static void configure() {
        load(new ServiceLocator());

        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 interface Service1 {
    void execute();
}

public class Service1Impl implements Service1 {
    private Service2 service2;

    public Service1Impl(Service2 service2) {
        this.service2 = service2;
    }

    public void execute() {
        System.out.println("Service1 is doing something.");
        service2.execute();
    }
}

public class Client {
    public void doSomething() {
        Service1 service1 = (Service1) ServiceLocator.lookup("service1");
        service1.execute();
    }

    public static void main(String[] args) {
        //Initialize the services
        ServiceLocator.configure();

        new Client().doSomething();
    }
}

(2)DI示例

  依赖注入的六种方式

你可能感兴趣的:(【04】创建型-小结-IOC应用)