结合模式java_图文结合讲解Java单例模式

ps:首先我们要先知道什么是单例,为什么要用单例,用的好处是什么等问题来看。

1:java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例

单例模式有以下特点:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个printer spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

2:懒汉式

先把单例类写出来

public class singletontest {

//懒汉式单例类.在第一次调用的时候实例化自己

private singletontest() {}

private static singletontest single=null;

//静态工厂方法

public static singletontest getinstance() {

if (single == null) {

single = new singletontest();

system.out.println("创建一次");

}

return single;

}

public void show(){

system.out.println("我是show");

}

}

这里直接上代码,代码中有详解

public class singletontest2 {

public static void main(string[] args) {

// todo auto-generated method stub

//故意写获取两次,创建两个对象

singletontest singleton=singletontest.getinstance();

singletontest singleton2=singletontest.getinstance();

//singleton对象只创建一次,但是写两次还是可以的,而且方法都是可以调用的,但是看下面

singleton.show();

singleton2.show();

//两个对象的表现形式一样

if(singleton == singleton2){

system.out.println("该对象的字符串表示形式:");

system.out.println("singleton :"+singleton.tostring());

system.out.println("singleton2:"+singleton2.tostring());

}

22477ee0804d871a5d450718a74c5359.png

由上面的图可以看出就算多创建几个对象,在底部也是只有一个singleton对象实例,而且创建出来的对象的字符串表现形式也是一样的,有的人肯定有疑问,那平常两个对象是什么样子的呢,我下面给你解释说明,在这之前我写说一下这个懒汉式需要注意的地方,它是线程不安全的,并发环境下很可能出现多个singleton实例,有很多方法可以解决,比如说同步锁,静态内部类等,这里主要说静态内部类,这个比较好点,

public class singleton3 {

private static class singletonholder {

private static final singleton3 instance = new singleton3();

}

private singleton3 (){}

public static final singleton3 getinstance() {

system.out.println("singleton创建");

return singletonholder.instance;

}

}

调用:

singleton3 singleton3=singleton3.getinstance();

singleton3 singleton4=singleton3.getinstance();

if(singleton3 == singleton4){

system.out.println("该对象的字符串表示形式:");

system.out.println("singleton3:"+singleton3.tostring());

system.out.println("singleton4:"+singleton4.tostring());

}

结果图:

02482c3086a77fb3f885da97477dbec8.png

这里我也是创建了两个对象来说明,神奇的是打印了两次singleton创建,这难道是又创建成功了的对象吗?答案是:虽然打印了两次,对象名也有两个,但是该对象的字符串表示形式还是一样的,而且大家都知道static的用法,就是在类被加载的同时该singleton对象就已经被创建,后期不会再被创建,就算后期自己又调用了getinstance()方法,但底层还是公用的一个singleton对象.

同样,我写了一个普通的类,来同时创建两个对象,并且打印他们的tostring()方法,如下:

qubie qb1=new qubie();

qubie qb2=new qubie();

if(qb1 == qb2){

system.out.println("该对象的字符串表示形式:");

system.out.println("singleton3:"+qb1.tostring());

system.out.println("singleton4:"+qb2.tostring());

}else{

system.out.println("该对象的字符串表示形式:");

system.out.println("singleton3:"+qb1.tostring());

system.out.println("singleton4:"+qb2.tostring());

}

0b5af20cacdeb7686373e4d1a293705a.png

由此可看出来对象的字符串表示形式是不一样的

3:饿汉式单例

饿汉式单例类.在类初始化时,已经自行实例化

public class singleton1 {

private singleton1() {}

private static final singleton1 single = new singleton1();

//静态工厂方法

public static singleton1 getinstance() {

return single;

}

}

因为这本身就是static修饰的方法,所以是在类加载的时候被创建,后期不会再改变,所以线程是安全的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值