工厂设计模式

目录

1、工厂设计模式引入

2、简单的工厂设计模式

3、通用工厂设计

4、测试代码如下


设计模式是专门用来解决某种特殊情况下的代码逻辑,今天,我们就来了解一下工厂设计模式。 

1、工厂设计模式引入

概念:通过工厂类,创建对象

//传统代码上我们会这么写代码
    UserService userService = new UserServiceImpl();
//上面代码在他们的类中就出现了强关联,一旦我们之后不适用这个impl,我们就不得不去修改这段代码,
    UserService userService = new UserServiceImplNew();

使用工厂类创建对象的好处:解耦合

耦合:代码间的强关联关系,一方的改变会影响到另一方。

耦合的问题:不利于代码的维护。强关联影响到一方改变牵动另一方必须改变

2、简单的工厂设计模式

public class BeanFcatory {

    private static Properties env = new Properties();

    static {
        try {
//        第一步,获得io的输入流
            InputStream inputStream = BeanFcatory.class.getResourceAsStream("/application.properties");
//        第二部,文件内容封装到env中,userService
            env.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static UserService getUserService(){

//        UserService userService = new UserServiceImpl();
//        return userService;
        UserService userService = null;
        try {

//            下面使用的全限定名中的impl如果不使用了,还是要进行修改,所以还是存在耦合
//            可以使用配置文件解决下面的字符串耦合问题
//            Class clazz = Class.forName("com.cloud.daxiang.service.impl.UserServiceImpl");

//           通过配置文件获取路径
            Class clazz = Class.forName(env.getProperty("userService"));
            userService = (UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }

   
}

这样,一个简单的工厂设计就出现了 ,但是如果每有一个类的实现类都需要这样写的话,会出现很多方法,getUserService、、getMenuService、getXXXService...会出现大量的代码冗余。所以我们可以写一个通用的工厂。

3、通用工厂设计

public class BeanFcatory {

    private static Properties env = new Properties();

    static {
        try {
//        第一步,获得io的输入流
            InputStream inputStream = BeanFcatory.class.getResourceAsStream("/application.properties");
//        第二部,文件内容封装到env中,userService
            env.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//    key为properties文件中key
    public static Object getBean(String key){

        Object ret = null;
        try {
            Class clazz = Class.forName(env.getProperty(key));
            ret = clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return ret;
    }
}

4、测试代码如下

properties文件内容(Mapper的impl只是为了方便,没有选择去链接数据库,这里可以不用在意) 

UserServiceImpl

 UserMapperImpl

具体测试看如下代码

输出结果如下

好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!

注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值