单例设计模式
2015-08-17 11:56
246 查看
保证在一个应用里面只有一个对象,实现方式有两种,懒汉式和饿汉式,
饿汉式一开始就初始化,并不存在线程的安全问题,实现如下
实现思路,私有化构造函数,不让new对象,提供静态方法返回该对象实例,在定义成员变量的时候初始化
饿汉式在使用的时候再去进行初始化,这样就有可能会产生线程安全问题,解决方式是双重检查
实现思路,私有化构造函数,在调用获取对象的时候再进行初始化,这样就回存在一个安全隐患,需要双重检查判断
在android应用中,我们经常也会用到单例模式,比入我在之前一个项目中,我把我的个人信息用一个单独的类管理,然后做成了单例,在是使用的时候需要传递Context,然后就会有内存泄露的危险
public class UserInfoManger {
private static UserInfoManger mUserInfoManger = new UserInfoManger();
private UserInfoManger(){}
private UserInfo mUserInfo;
public static UserInfoManger getInstance(){
return mUserInfoManger;
}
public UserInfo getmUserInfo(Context context) {
if( mUserInfo == null){
mUserInfo = new UserInfo(context);
}
return mUserInfo;
}
}
这里应该加上一些处理
饿汉式一开始就初始化,并不存在线程的安全问题,实现如下
实现思路,私有化构造函数,不让new对象,提供静态方法返回该对象实例,在定义成员变量的时候初始化
public class Person { private Person(){} private static Person p = new Person(); public static Person getInstance(){ return p; } }
饿汉式在使用的时候再去进行初始化,这样就有可能会产生线程安全问题,解决方式是双重检查
实现思路,私有化构造函数,在调用获取对象的时候再进行初始化,这样就回存在一个安全隐患,需要双重检查判断
public class Person { private Person() {} private static Person p; public Person getInstance(){ if(p == null){ synchronized (Person.class) { if(p == null){ p = new Person(); } } } return p; } }
在android应用中,我们经常也会用到单例模式,比入我在之前一个项目中,我把我的个人信息用一个单独的类管理,然后做成了单例,在是使用的时候需要传递Context,然后就会有内存泄露的危险
public class UserInfoManger {
private static UserInfoManger mUserInfoManger = new UserInfoManger();
private UserInfoManger(){}
private UserInfo mUserInfo;
public static UserInfoManger getInstance(){
return mUserInfoManger;
}
public UserInfo getmUserInfo(Context context) {
if( mUserInfo == null){
mUserInfo = new UserInfo(context);
}
return mUserInfo;
}
}
这里应该加上一些处理
public class UserInfoManger { private static UserInfoManger mUserInfoManger = new UserInfoManger(); private UserInfoManger(){} private UserInfo mUserInfo; public static UserInfoManger getInstance(){ return mUserInfoManger; } public UserInfo getmUserInfo(Context context) { if( mUserInfo == null){ context.getApplicationContext(); mUserInfo = new UserInfo(context); } return mUserInfo; } }
相关文章推荐
- 纯CSS3实现滑动开关效果
- Linux编程基础——GDB(设置断点)
- 验证码无法显示:Could not initialize class sun.awt.X1 解决方案
- 基于Tomcat7、Java、WebSocket的服务器推送聊天室
- Jlink V8固件修复(支持MDK4.70a)
- 网络加载时Dialog
- zoj 3203 Light Bulb,三分之二的基本问题
- mqtt 协议之 PINGREQ, PINGRESP
- 数字整除
- 阻止冒泡和阻止默认事件——cancelBubble和stopPropagation
- Android学习系列--App调试内存泄露之Context篇(下)
- OC关于NSFileManager的再详解
- Oracle数据库登录错误提示提示ora 01033:oracle initialization or shutdown in progress,oracle11g
- 共享内存
- POJ 1017 Packets(贪心)
- 停止数据库
- C#实现的简单链表类实例
- java的内存回收
- kali Linux使用蓝牙
- 单件转化成本CPA优化策略