java单例模式-java单例模式使用场景
单例模式 单例模式是一种常见的设计模式,
单例模式分为懒惰单例、饥饿单例和注册单例三种。
单例模式具有以下特点:
1、一个单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3.单例类必须将这个实例提供给所有其他对象。
1. Lazy-style singleton 当类被加载时java单例模式,唯一的实例已经被创建。 这种设计模式在Java中很容易实现,但在其他语言中很难实现。
单例模式 - 懒惰的单例
公共课 LazySingleton {
/*** 私有静态对象,加载时不初始化*/
私有静态 LazySingleton m_intance=null;
/*** 私有构造函数,避免外部创建实例*/
私有 LazySingleton(){}
/*** 静态工厂方法,返回该类的唯一实例。* 当发现实例未初始化时,会进行初始化。 * @return LazySingleton */
同步公共静态 LazySingleton getInstance(){
如果(m_intance==null){
m_intance=new LazySingleton();
}
返回 m_intance;
}
}
//测试单例模式
LazySingleton lazySingleton = LazySingleton. 获取实例();
LazySingleton lazySingleton1 = LazySingleton。 获取实例();
如果(lazySingleton==lazySingleton1)){
System.out.println("同一个对象实例");
}别的{
System.out.println("不是同一个对象实例");
}
2.饥饿式单例在加载类时不创建单例实例。 只有在第一次请求实例时才会创建,并且只有在第一次创建之后才会创建,以后不会再创建该类的实例。
/***单例模式-饿了么中国式单例*/
公共课 EagerSingleton {
/**私有(private)唯一(static final)实例成员,单例对象在类加载时创建*/
private static final EagerSingleton m_instance = new EagerSingleton();
/*** 私有构造函数,避免外部创建实例*/
private EagerSingleton() {} //提供一个空的构造函数
/*** 静态工厂方法,返回该类的唯一实例。* @return EagerSingleton */
公共静态 EagerSingleton getInstance() {
返回 m_instance;
}
}
//判断是否有单case效果(系统运行时只出来一个空case)
EagerSingleton eagerSingleton = EagerSingleton。 获取实例();
EagerSingleton eagerSingleton1 = EagerSingleton。 获取实例();
如果(eagerSingleton==eagerSingleton1)){
System.out.println("同一个对象实例");
}别的{
System.out.println("不是同一个对象实例");
}
3.注册单例这个单例实际上维护了一组单例类实例,并将这些实例存储在一个Map(注册簿)中。 对于已注册的实例,它们直接从工厂返回。 未登记者,先登记后返回。
/*** 单例模式——注册单例 */
公共课 RegSingleton {
/*** 注册簿,用于存放所有注册过的实例*/
私有静态地图 m_registry = new HashMap();
//加载类时向注册表添加一个实例
静止的 {
RegSingleton x = new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}
/*** 受保护的默认构造函数 */
受保护的 RegSingleton() {}
/*** 静态工厂方法,返回指定注册对象的唯一实例;
* 已登记者,直接取出并归还,未登记者,先登记后取出并归还
* @参数名称
* @返回
注册单例 */
公共静态 RegSingleton getInstance(字符串名称){
如果(名称==空){
name = "RegSingleton";
}
如果(m_registry.get(名称)== null){
尝试 {
m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
} 赶上(InstantiationException e){
e.printStackTrace();
} 抓住(IllegalAccessException e){
e.printStackTrace();
} 赶上(ClassNotFoundException e){
e.printStackTrace();
}
}
返回 m_registry。 得到(名字);
}
/** * 一个说明性的业务方法 * @return String */
公共字符串关于(){
return "你好java单例模式,我是 RegSingleton!";
}}
4.单例模式的一个应用这个应用是配置文件管理类。 为了正确运行这个例子,我先在C盘下创建了一个xxxx.properties文件,内容如下: ------------------
user=rootpassword=leizhimin配置文件管理类代码如下:
单例应用-单例应用-配置文件管理*/
公共类 ConfigManager {
/*** 属性文件全名 */
private static final String PFILE = "C:\\xxx.properties";