0
点赞
收藏
分享

微信扫一扫

设计模式之Java单例模式No.1

迪莉娅1979 2022-03-22 阅读 68
java

单例模式:
核心概念:确保一个类在JVM虚拟机内存中只有一个对象实例存在;

单例模式有什么好处:

在业务开发中,某些类创建是非常频繁的,如果该类可以创建多个实例,这样就造成了资源浪费,对于一些大型的类对象,在内存中是一笔比较大的开销,使用单例模式则省去了new操作,降低系统内存的使用频率,减轻GC(垃圾回收)的压力,使用单例可以避免对资源的重复占用;

如何实现单例
1.构造方法必须私有化,这样做可以使外部类无法通过构造器创造该实例,可以更好管理类的实例创建;
2.提供全局唯一的一个对象,做私有化处理不让外界之间调用;
3.提供公共的全局方法供外界获取,返回对象实例
4.没有公开的的set方法供外部创建该对象实例

饿汉式

使用场景
如果在应用中一块数据经常被访问就可以使用饿汉式;
具体代码如下:

public class TestDesign {

    public static void main(String[] args) {
        MyDesign myDesign=MyDesign.getMyDesign();
        MyDesign myDesign2=MyDesign.getMyDesign();
        System.out.println(myDesign==myDesign2);//true
    }
}
class MyDesign{

    //1.构造方法私有化,防止外部调用构造方法创建对象
    private MyDesign(){
    }
    //2.定义全局唯一的一个对象,做私有化处理不让外界之间调用;
    private  static MyDesign myDesign=new MyDesign();
    //3.提供公共的全局方法供外界获取,返回对象实例,
    public static MyDesign getMyDesign(){
        return myDesign;
    }
}

结论:饿汉式如同他的名字一样,直接上来就直接初始化当前类的实例;

懒汉式:

懒汉式与饿汉式最大的区别就是:在需要用的时候再实例一个对象,不直接去创建实例化对象,而是在需要的时候再去创建实例对象;
第二个区别:懒汉式线程不安全

public class TestDesign2 {

    public static void main(String[] args) {
        MyDesign2 myDesign2=MyDesign2.getMyDesign();
        System.out.println(myDesign2);
    }
}

class MyDesign2{
    //1.构造方法私有化,防止使用构造方法实例化
    private MyDesign2(){}
    //2.定义静态私有引用类型变量,私有化防止外界直接调用
    private static MyDesign2 myDesign;
    
    /*
    * 这里会有线程安全问题
    *3.提供公共的静态的全局方法供调用
    * */
    public static MyDesign2 getMyDesign() {
        if (myDesign==null){
            myDesign= new MyDesign2();
        }
        return myDesign;
    }
}

线程安全问题:
解决方案1:加锁 双重检测(synchronized),弊端:这种方式会降低系统的处理速度以及在Java中存在反射类,可以直接无视私有的构造方法去直接new对象。
推荐方案:使用枚举类型

举报

相关推荐

0 条评论