目录
设计模式是专门用来解决某种特殊情况下的代码逻辑,今天,我们就来了解一下工厂设计模式。
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
具体测试看如下代码
输出结果如下
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受