文档章节

单例模式

Mr_菜
 Mr_菜
发布于 2016/03/27 17:50
字数 648
阅读 6
收藏 0

UML图


单例设计模式的步骤:    


饿汉单例设计模式
    1. 私有化构造函数。
    2. 声明本类的引用类型变量,并且使用该变量指向本类对象。
    3. 提供一个公共静态的方法获取本类的对象。

//饿汉单例设计模式 ----> 保证Single在在内存中只有一个对象。
class Single{
     //声明本类的引用类型变量,并且使用该变量指向本类对象
    private static Single s = new Single();
    //私有化构造函数(堵死了外界利用new创建此类实例的可能)
    private Single(){    
    }
    //提供一个公共静态的方法获取本类的对象
    public static Single getInstance(){
        return s;        
    }
}

public class Test {
    public static void main(String[] args) {
        Single s1 = Single.getInstance();
        Single s2 = Single.getInstance();
        System.out.println("s1和s2是一个对象吗?\n"+(s1==s2));
    }

}

输出如下:

懒汉单例设计模式:
    1. 私有化构造函数。
    2. 声明本类的引用类型变量,但是不要创建对象,
    3. 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象
    ,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,
    然后再返回。


class Single2{
	
	//声明本类的引用类型变量,不创建本类的对象
	private static Single2 s;

	//私有化了构造函数
	private Single2(){}

    //提供一个公共静态的方法获取本类的对象(此方法是获得本类实例的唯一全局访问点)
	public static Single2 getInstance(){
		if(s==null){
			s = new Single2();
		}
		return s;
	}
}


public class Test {
	public static void main(String[] args) {
		Single2 s1 = Single2.getInstance();
		Single2 s2 = Single2.getInstance();
		System.out.println("s1和s2是一个对象吗?\n"+(s1==s2));
	}

}



输出如下:


推荐使用: 饿汉单例设计模式。  因为懒汉单例设计模式会存在线程安全问题。


双锁单例模式

class Singleton{
    private static Singleton s;
    private Singleton(){
    }
    
    public static Singleton getInstance(){
         if (s == null) {
                synchronized (Singleton.class) {
                    if (s == null) {
                        s = new Singleton();
                    }
                }
            }
            return s;
        }
    }


public class Test02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println("s1和s2是一个对象吗?\n"+(s1==s2));
    }

}


输出如下:

对于synchronized还有很多不了解,后续慢慢学习



© 著作权归作者所有

Mr_菜
粉丝 1
博文 13
码字总数 8804
作品 0
西安
程序员
私信 提问

暂无文章

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
52分钟前
4
0
通过OAuth2.0 获取授权访问SF 用户数据

通过OAuth2.0 获取授权访问SF 用户数据 OAuth2.0 相关知识 深入了解 Salesforce 中的 OAuth 2.0(SF官方) OAuth 2.0 的一个简单解释(阮一峰大神) OAuth 2.0 的四种方式(阮一峰大神) GitHub OA...

在山的那边
58分钟前
7
0
编写程序:从键盘上接受一个三位数(首先要确保是三位数),计算出各位之和输出。

#include<stdio.h> int main() { int a,sum=0; printf("请输入一个三位数:\n"); scanf("%d",&a); sum=a/100+a%100/10+a%10; printf("这三个数的和:%d",sum); return 0; }......

201905021729吴建森
今天
7
0
如何离开/退出/停用Python virtualenv

我正在使用virtualenv和virtualenvwrapper。 我可以使用workon命令在virtualenv之间切换。 me@mymachine:~$ workon env1(env1)me@mymachine:~$ workon env2(env2)me@mymachine:~$ workon e......

技术盛宴
今天
7
0
成长之路 万事坚持难

任何事情开了头,想要更好的发展下去,不忘初心,就一定要坚持下去。 以前自己坚持了一些事情,比如早睡不吃东西,由于中途断了,没有及时止损,导致又接着恶习断了几天。所以 及时的反省和调...

T型人才追梦者
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部