工厂模式解耦---控制反转

控制反转

是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
----来自百度

工厂

使用工厂依赖来对对象注入依赖。


没有使用工厂模式前

工厂模式解耦---控制反转_第1张图片

使用了工厂模式之后
工厂模式解耦---控制反转_第2张图片

Beans.properties配置文件

工厂将解析properties配置文件获取到对应的keyvalue
在工厂类中使用java反射技术来在程序运行期间注入依赖创建对象。

User=com.domain.User
ISelimpl=com.dao.Impl.ISelimpl
IUserSelimpl=com.service.Impl.IUserSelimpl

beansFactory 工厂类

package com.factory;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Beasfactory {
     
    private static Properties properties = null;
    private static Map<String, Object> beans = null;

    static {
     

        try {
     
            properties = new Properties();
            //使用类加载器获取Properties的流对象
            InputStream in = Beasfactory.class.getClassLoader().getResourceAsStream("Beans.properties");
            properties.load(in);
            beans = new HashMap<String, Object>();
            final Enumeration keys = properties.keys();
            while (keys.hasMoreElements()) {
     
                String key = keys.nextElement().toString();
                String beanpath = properties.getProperty(key);
                Object value = Class.forName(beanpath).newInstance();
                beans.put(key, value);
            }

        } catch (Exception e) {
     
            //ExceptionInInitializerError 它继承的是一个Error 会直接终止程序
            throw new ExceptionInInitializerError("初始化失败");
        }

    }

    /**
     * 获取单例对象
     *
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName) {
     
        return beans.get(beanName);
    }
}

在工厂类中我们使用Map来存储对象,这样我们在需要使用这些对象时直接获取对象,不需要重新创建对象,降低了JVM的负担,这就是单例对象,其他类在调用该对象时都是获取它的引用,本质上都是同一个对象(内存地址相同)。

实例

package com.service.Impl;

import com.dao.ISel;
import com.dao.Impl.ISelimpl;
import com.factory.Beasfactory;
import com.service.IUserSel;

public class IUserSelimpl implements IUserSel {
     

    public void userSelAll() {
     
        ISel sel= (ISelimpl)Beasfactory.getBean("ISelimpl");
        sel.selAll();

    }
}

工厂模式降低了程序的耦合性,提高了程序的独立性,逻辑性也更强了,调用关系也明朗了。

你可能感兴趣的:(java,设计模式)