单例模式:
确保一个类只有一个实例,并提供一个全局的访问点。
为什么用单例模式:
无状态类:只需要一个实例就够了。多实例只会多占用内存,无线程安全问题。
有状态类:可以做到全局共享状态,但要注意线程安全问题。
如何确保一个类只有一个实例:
1.将构建器设为private,以确保该类不能被外部实例化
2.在类的内部进行实例化,并把实例保存在静态变量中
3.提供一个static的getInstance 方法返回该实例
代码示例一:
publicclass UserManager {
privatestatic UserManager userManager = new UserManager();
private UserManager(){
//私有构建器,外部不能实例化
}
public UserManager getInstance(){
returnuserManager;
}
publicvoid login(String userId){
//cache message of user
}
publicboolean isLogin(String userId){
// find message of user in cache
returnfalse;
}
}
代码示例二:
publicclass UserManager {
privatestaticvolatile UserManager userManager = null;
private UserManager(){
//私有构建器,外部不能实例化
}
public UserManager getInstance(){
if(userManager == null){
synchronized(UserManager.class){
if(userManager == null){
UserManager tempInstance = new UserManager();
userManager = tempInstance;
}
}
}
returnuserManager;
}
publicvoid login(String userId){
//cache message of user
}
publicboolean isLogin(String userId){
// find message of user in cache
returnfalse;
}
}
单例模式的缺点:
从整个系统层面看,会有N多类依赖了单例模式的具体类,违反了依赖抽像而不依赖具体类的原则,如果某一天要替换掉这个单例模式类,将会是繁琐的事情,同时也违反了开闭原则。
单例模式的应用场景:
一般情况下,接口不会发生变化的类,否则的话可以使用spring构建单例。