单例工厂和多列工厂

十一假期重新复习spring知识点,做个记录后期回顾使用。

一、测试模块结构如图:

二、具体代码

2.1接口
package com.bank.dao;

public interface IUserDao {

    int addInsert();
}

package com.bank.service;

public interface IUserService {

    int addUserService();
}

2.2实现类

package com.bank.dao.impl;

import com.bank.dao.IUserDao;

public class UserDaoImpl implements IUserDao {
    public int addInsert() {

        System.out.println("UserDaoImpl 执行了..." );
        return 0;
    }
}
package com.bank.service.impl;

import com.bank.dao.IUserDao;
import com.bank.factory.BeanFactory;
import com.bank.service.IUserService;

public class UserServiceImpl implements IUserService {

    public int addUserService() {

        System.out.println(" UserServiceImpl 执行了 ...... ");
        //通过单例工厂获取对象IUserDao
        IUserDao userDao = BeanFactory.getBeanImpl(IUserDao.class);
        userDao.addInsert();
        return 0;
    }
}

2.3工厂类

2.3.1单例工厂

package com.bank.factory;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

public class BeanFactory {

    private static final Map<String, Object> beanFactory = new HashMap<String, Object>();

    static {
        try {
            //1.加载配置文件
            ResourceBundle config = ResourceBundle.getBundle("config");
            //获取Key值和value
            Enumeration<String> keys = config.getKeys();
            while (keys.hasMoreElements()) {
                //获取key
                String key = keys.nextElement();

                //获取value
                String value = config.getString(key);
                //将value转化为对象
                Class<?> aClass = Class.forName(value);
                Object instance = aClass.newInstance();
                //将值放入map中
                beanFactory.put(key, instance);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }

    public static <T> T getBeanImpl(Class<T> iClass) {
        //获取接口类名
        String name = iClass.getSimpleName();
        //根据类名获取对象并返回
        T t = (T) beanFactory.get(name);

        return t;
    }
}

2.3.2多例工厂

package com.bank.factory;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

public class BeanFactoryMuti {

    private static final Map<String,String> beanFatory=new HashMap<String,String>();
    static {
        try {
            //加载配置文件
            ResourceBundle config = ResourceBundle.getBundle("config");
            //获取Key值和value
            Enumeration<String> keys = config.getKeys();
            while (keys.hasMoreElements()){

                String key = keys.nextElement();

                String value = config.getString(key);
                //将值放入map中
                beanFatory.put(key,value);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw  new RuntimeException(e);
        }

    }

    public static <T> T getBeanImpl(Class<T> iClass) throws Exception {

        String name = iClass.getSimpleName();

        String  s = beanFatory.get(name);

        Class<?> aClass = Class.forName(s);
        T t = (T) aClass.newInstance();

        return t;
    }
}

2.4测试类

package com.bank.test;

import com.bank.factory.BeanFactory;
import com.bank.factory.BeanFactoryMuti;
import com.bank.service.IUserService;
import org.junit.Test;

public class UserServiceTest {

    @Test
    public void test01() {

        IUserService userService = BeanFactory.getBeanImpl(IUserService.class);
        userService.addUserService();
    }

    @Test
    public void test02(){

        for (int i = 0; i <10 ; i++) {
            IUserService userService = BeanFactory.getBeanImpl(IUserService.class);
            System.out.println("userService = " + userService);

        }
    }
    
    

    @Test
    public void test03() throws Exception {

        IUserService userService = BeanFactoryMuti.getBeanImpl(IUserService.class);
        userService.addUserService();
    }

    @Test
    public void test04() throws Exception {
        for (int i = 0; i <10 ; i++) {
            IUserService userService = BeanFactoryMuti.getBeanImpl(IUserService.class);
            System.out.println("userService = " + userService);

        }
        
    }

}

2.5配置文件

config.properties

IUserDao=com.bank.dao.impl.UserDaoImpl IUserService=com.bank.service.impl.UserServiceImpl

pom.xml

<dependencies>
    <!--Spring的核心包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
    <!--junit包-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>

三、测试结果

单例工厂:

如同验证单例工厂(获取的对象只有一个)

多例工厂:

多例工厂验证(每次都是一个新的对象)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
单例模式和工厂模式是两种不同的设计模式,它们解决的问题和应用场景也不同。 1. 单例模式: - 目的:确保一个类只有一个实例,并提供全局访问点。 - 适用场景:当只需要一个实例来协调操作、控制资源或存储全局状态时,可以使用单例模式。 - 实现方式:通过限制类的实例化和提供静态方法来获取实例。 2. 工厂模式: - 目的:封装对象的创建过程,隐藏具体实现细节,提供统一的接口来创建对象。 - 适用场景:当需要根据某些条件动态创建对象,并且希望将创建逻辑与使用逻辑解耦时,可以使用工厂模式。 - 实现方式:定义一个工厂类,该类负责创建对象的实例,并提供一个公共的工厂方法来创建对象。 区别: - 单例模式关注于一个类只有一个实例的问题,它的主要目的是限制实例化并提供全局访问点。而工厂模式关注于对象的创建过程和对外提供统一的接口。 - 单例模式的核心是保证只有一个实例存在,通过静态方法获取该实例。而工厂模式的核心是将对象的创建过程封装起来,通过工厂类来创建对象。 总结: 单例模式和工厂模式是两种不同的设计模式,它们解决的问题和应用场景不同。单例模式用于确保一个类只有一个实例,并提供全局访问点;而工厂模式用于封装对象的创建过程,提供统一的接口来创建对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值