java静态单例模式代码 java单例和静态的区别

关于java静态内部类形式的单例模式

static Singleton instance = new Singleton();  

10年积累的网站建设、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有朝阳免费网站建设让你可以放心的选择与我们合作。

static类型的成员变量,只会在新建类的对象时被执行一次。

所以static Singleton instance = new Singleton();   只有在第一次调用时,被new一次。之后获取的都是第一次执行的对象。所以称之为单例。

也可以使用老的写法,比较清晰一些。

class ABC {

private static ABC instance;

private ABC() {}

public ABC getInstance() {

if (instance==null)

instance = new ABC();

return instance;

}

}

这样写法的缺点是效率不如

class ABC {

private static ABC instance= new ABC();

private ABC() {}

public ABC getInstance() {

return instance;

}

}

这样写法高。

JAVA static 单例模式

单例模式可以理解为是面向对象语言中对全局变量的一种实现,当然的作用不仅仅限于此。我们可以对单例模式实现的过程中的思路进行一下剖析,如此更加清楚的认识到设计模式究竟是什么,当然也可以证明一下基础知识的重要性(基础才是王道)。

首先我们分析一下单例的意义,在Java中为一个类只能有一个实例化对象。这显然不是我们平常所写的一个普通类所能够做到的事情。那么为了实现这一个要求该如何去做呢。实例化是一个类的初始化时候的问题,而初始化是构造方法去做的事情(当然这里面jvm也帮我们做了很多的事情)。构造方法,我们要设为私有。这样我们让该类不能被随意的初始化,那该在哪初始化,而它有怎样被调用呢。

一个不能初始化的类,也就是说不能够被实例化的类,我们想要调用。那么无疑让我们想到了static关键字,一个public static 的方法可以实现我们这个要求——即在不实例化类的情况下能够调用其中的方法。于是我们写下了一个public static 的方法,用于得到这个类的唯一实例。而这个实例我们是在类的内部实例,并同样定义为 static 的变量(一直用static 只是为了能够不实例化便可以使用。因为static可以在类初始化的时候便生成了,对于此不理解的同学们可以查看我的前一篇博客。。。)。到这里我们一个单例模式的实现框架其实已经搭好了。

单例模式代码怎么写?

 单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。

可分为eager模式,示例代码如下:

Java代码

1.class EagerSingleton{

2. private static final EagerSingleton m_instance = new EagerSingleton();

3. private EagerSingleton(){}

4. public static EagerSingleton getInstance(){

5. return m_instance;

6. }

7.}

class EagerSingleton{

private static final EagerSingleton m_instance = new EagerSingleton();

private EagerSingleton(){}

public static EagerSingleton getInstance(){

return m_instance;

}

}

和 lazy模式,示例代码如下:

Java代码

1.class LazySingleton{

2. private static LazySingleton m_instance = null;

3. private LazySingleton(){}

4. public synchronized static getInstance(){

5. if(m_instance == null){

6. m_instance = new LazySingleton();

7. }

8. return m_instance;

9. }

10.}

class LazySingleton{

private static LazySingleton m_instance = null;

private LazySingleton(){}

public synchronized static getInstance(){

if(m_instance == null){

m_instance = new LazySingleton();

}

return m_instance;

}

}

java源码中,Runtime.getRuntime()就是单例的一个例子。

单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。

多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。

示例代码如下:

Java代码

1.class Multiton{

2. private final int INSTANCE_SIZE = 10;

3. private static Map instances = new HashMap(INSTANCE_SIZE);

4. private String name;

5. private Multiton(){}

6. private Multiton(String name){

7. this.name = name;

8. }

9. public synchronized static getInstance(String name){

10. if(instances.containsKey(name)){

11. return instances.get(name);

12. }

13. else{

14. ins = new Multiton(name);

15. instances.put(name, ins);

16. return ins;

17. }

18. }

19.}

class Multiton{

private final int INSTANCE_SIZE = 10;

private static Map instances = new HashMap(INSTANCE_SIZE);

private String name;

private Multiton(){}

private Multiton(String name){

this.name = name;

}

public synchronized static getInstance(String name){

if(instances.containsKey(name)){

return instances.get(name);

}

else{

ins = new Multiton(name);

instances.put(name, ins);

return ins;

}

}

}

[nextpage]

一个实用的例子就是KeyGenerator, 示例代码如下:

Java代码

1.class KeyGenerator{

2. private final int POOL_SIZE = 20;

3. private static Map instances = new HashMap(16);

4. private KeyInfo keyinfo;

5. private KeyGenerator(){}

6. private KeyGenerator(String keyName){

7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName);

8. }

9. public synchronized static getInstance(String keyName){

10. if(instances.containsKey(keyName)){

11. return (KeyGenerator)instances.get(keyName);

12. }

13. else{

14. keyGen = new KeyGenerator(keyName);

15. instances.put(name, keyGen);

16. return keyGen;

17. }

18. }

19. public synzhronized int getNextKey(){

20. return keyinfo.getNextKey();

21. }

22. }

class KeyGenerator{

private final int POOL_SIZE = 20;

private static Map instances = new HashMap(16);

private KeyInfo keyinfo;

private KeyGenerator(){}

private KeyGenerator(String keyName){

this.keyinfo = new KeyInfo(POOL_SIZE, keyName);

}

public synchronized static getInstance(String keyName){

if(instances.containsKey(keyName)){

return (KeyGenerator)instances.get(keyName);

}

else{

keyGen = new KeyGenerator(keyName);

instances.put(name, keyGen);

return keyGen;

}

}

public synzhronized int getNextKey(){

return keyinfo.getNextKey();

}

}


网站栏目:java静态单例模式代码 java单例和静态的区别
链接地址:http://scyanting.com/article/ddjhdhe.html