简单总结单例模式的4种写法

网友投稿 530 2023-01-12

简单总结单例模式的4种写法

简单总结单例模式的4种写法

一、单例模式

属于创建者模式的一种, 单例模式的目的是使该类只有一个实例,同一个类的不同对象有不同的hashCode()

单例模式是由该类自行创建唯一个向外暴露的全局的对象

二、写法

饿汉式:无线程安全,但是类以加载就会创建实例,浪费资源

懒汉式:存在线程安全,需要加synchroined

内部类:无线程安全(完美方案)

枚举: 线程安全,听说是高效java推荐的写法

三、饿汉式

/**

* 饿汉式:

* 不适用new创建对象而是使用静态的getInstance()方法创建对象

* jvm保证线程安全

*/

public class SingleTest{

public static void main(String[] args) {

Single single1 = Single.getInstance();

Single single2 = Single.getInstance();

System.out.println(single1.hashCode());

System.out.println(single2.hashCode());

System.out.println(single1 == single2);

}

}

class Single {

final static Single INSTANCE = new Single();

public static Single getInstance(){return INSTANCE;}

}

四、懒汉式

//懒汉式的线程安全的写法又称为双检索懒汉模式

public class SingleTest {

public static void main(String[] args) {

for(int i = 0;i < 10; i++){

new Thread(new Runnable() {

@Override

public void run() {

System.out.println(Single.getInstance().hashCode());

}

}).start();

}

}

}

class Single{

private static Single instance = null;

Single(){}

public static Single getInstance(){

if (instance == null){

synchronized (Single.class) {

if(instance == null){

try{

Thread.sleep(1);

}catch (Exception e){

e.printStackTrace();

}

instance = new Single();

}

}

}

return instance;

}

}

五、内部类

/**

* 静态内部类:完美写法

*/

public class SingleTest {

public static void main(String[] args) {

Single single1 = Single.getInstance();

Single single2 = Single.getInstance();

System.out.println(single1.hashCode());

System.out.println(single2.hashCode());

System.out.println(single1 == single2);

}

}

class Single{

private static Single instance;

public static Single getInstance(){

return InnerSingle.INSTANCE;

}

private static class InnerSingle{

private final static Single INSTANCE = new Single();

}

}

六、枚举

//枚举:完美写法

public class SingleTest {

public static EGljRHyvoid main(String[] args) {

Single single1 = Single.INSTANCE;

Single single2 = Single.INSTANCE;

System.out.println(single1.hashCode());

System.out.println(single2.hashCode());

System.out.println(single1 == single2);

}

}

enum Single{

INSTANCE;

}

七、结论

优点:

单例模式可以保证内存里只有一个实例,减少了内存的开销。

避免对资源的多重占用

单例模式设置全局访问点,可以优化和共享资源的访问。

缺点:

没有接口,扩展不了代码,违背了开闭原则

单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:金融小程序开放平台(金融小程序开放平台官网)
下一篇:小程序生态进化风口图(小程序生态圈)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~