标签:耦合 地方 享元模式 case jdk 参数 cache 登录 代码
用工厂的主要目的是把对象的创建和使用分离,这比较符合单一职责原则,工厂负责创建产品,调用者负责使用产品,如果调用者既需要负责创建产品又需要负责使用产品,那么耦合性会比较高。
以一个常见的登录功能为例:
class HibernateUserDao {
public void getUser() {
System.out.println("Hibernate get user");
}
}
public class UserService {
private MybatisUserDao userDao;
public UserService() {
this.userDao = new MybatisUserDao();
}
public void login() {
userDao.getUser();
}
}
这样的坏处是什么呢?我们发现UserService的责任太重,不仅要创建UserDao的实例对象还要调用。假如现在公司为了统一项目都换成MyBatis那么更改起来非常麻烦。
我们对代码稍作修改:
/**
* UserDao作为产品让工厂创建
*/
public interface UserDao {
void getUser();
}
/**
* UserDao的不同实现
*/
class MybatisUserDao implements UserDao {
@Override
public void getUser() {
System.out.println("Mybatis get user");
}
}
class HibernateUserDao implements UserDao {
@Override
public void getUser() {
System.out.println("Hibernate get user");
}
}
public class UserService {
private UserDao userDao;
public UserService(String name) {
this.userDao = new MybatisUserDao();
}
public void login() {
userDao.getUser();
}
}
public class Factory {
public static UserDao getUserDao(String name) {
switch (name) {
case "mybatis":
return new MybatisUserDao();
case "hibernate":
return new HibernateUserDao();
default:
return null;
}
}
}
我们来看一下JDK中的Integer的创建方式:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
我们可以认为他把Integer的工厂和产品合并了,valueOf作为生产方法,这样做的好处是客户端使用这个方法可以用到IntegerCache的常量池优化,如果直接new就没有优化了。使用常量池也可以看做享元模式的思想,后面的博客会说到。
标签:耦合 地方 享元模式 case jdk 参数 cache 登录 代码
原文地址:https://www.cnblogs.com/barneycs/p/13296450.html