单例模式singleten及实现思想

一、单例模式的特点

1、只能有一个实例;

2、只能本身调用本身,生成一个实例;

3、只能为其他对象提供这一个实例。


二、实现思想

定义一个实例的时候会调用构造方法,因此单例模式的思想也应从构造方法入手;

先定义一个主类和一个单例类:

public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 = 
}
}

class SingleTest
{
public SingleTest()
{

}
}

上述方式中,可以定义多个实例,不符合;把SingleTest()构造方法的类型参数改成private,如下:

class SingleTest
{
private SingleTest()
{

}
}

则,在主类中一次都无法进行实例化了。解决办法:在SingleTest类中定义一个public的方法,用于调用构造函数,如下:

class SingleTest
{
private SingleTest()
{

}

public  SingleTest getInstance()

{

return new SingleTest ();

}
}

修改后,若想调用getInstance()方法,则需先实例化,但目前用new SingleTest()的方式进行实例化明显不行,因此考虑用“类名称.方法名()”的方式,则getInstance()要定义成static类型,如下:

public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 = SingleTest.getInstance();

SingleTest test2 = SingleTest.getInstance();
}
}

class SingleTest
{
private SingleTest()
{

}

public  static SingleTest getInstance()

{

return new SingleTest ();

}
}

结果:

但是,此种方式很明显可以产生多个实例化对象。因此,需要把getInstance()方法体中的返回参数修改成固定实例, 即首先实例化一个对象,再把此对象返回,就可以得到唯一的一个实例,如下:

public class SingleDemo
{
public static void main(String args[])
{
SingleTest test1 = SingleTest.getInstance();

SingleTest test2 = SingleTest.getInstance();
}
}


class SingleTest
{

private static SingleTest st = new SingleTest (); 
private SingleTest()
{

}

public  static SingleTest getInstance()

{

return st;

}
}

结果:   可以看出,只能实例化一次。

注意: 由于st使用在getInstance()方法体中,因此定义为static类型;st最好定义为private类型的,public类型的也可以,但是不推荐。


或者,也可以这样写:

class SingleTest
{

private static SingleTest st; 
private SingleTest()
{

}

public  static SingleTest getInstance()

{

    if(st == null)

    {

        st = new SingleTest();

    }

return st;

}
}

这种方式适合于多线程中使用。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值