设计模式 –单例模式

news/2024/7/3 13:34:28

1 概念

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
实现方法:
(1) 构造器私有化 。
(2) 类的内部创建对象。
(3) 向外暴露一个静态的公共方法。

2 饿汉式

优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费

public class HungrySingleton {

    private static final HungrySingleton hungrySingleton = new HungrySingleton();


    private HungrySingleton() {

    }

    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }


}

3 懒汉式

懒汉式单例的特点是:被外部类调用的时候内部类才会加载

3.3 类锁

public class LazySingleton {

    private static LazySingleton lazySingleton = null;

    private LazySingleton() {

    }

    /**
     * 类锁,线程安全,锁粒度较高
     */
    public static synchronized LazySingleton getInstance() {
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }


}

3.2 双重检查

public class LazyDoubleCheckSingleton {

    private static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;


    private LazyDoubleCheckSingleton() {

    }

    /**
     * 双重检查,类锁,锁粒度较低
     */
    public static LazyDoubleCheckSingleton getInstance() {

        if (lazyDoubleCheckSingleton == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazyDoubleCheckSingleton != null) {
                    return lazyDoubleCheckSingleton;
                }
                lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
                return lazyDoubleCheckSingleton;
            }

        }
        return lazyDoubleCheckSingleton;
    }

}

3.3 内部类

public class LazyInnerClassSingleton {

    private LazyInnerClassSingleton() {

    }

    /**
     * 内部类特性,当外部调用时,内部类初始化
     */
    public static LazyInnerClassSingleton getInstance() {
        return Lazyholder.LAZY;
    }

    private static class Lazyholder {

        private static final LazyInnerClassSingleton LAZY = new LazyInnerClassSingleton();

    }

}

PS: 反射破坏单例模式

public class ReflectDestoryDemo {

    public static void main(String[] args) throws Exception {

        Class<?> clazz = LazyDoubleCheckSingleton.class;
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object o1 = constructor.newInstance();
        LazyDoubleCheckSingleton o2 = LazyDoubleCheckSingleton.getInstance();
        System.out.println(o1 == o2);
    }

}

在这里插入图片描述

4 注册式单例

public class ContainerSingleton {

    private ContainerSingleton() {

    }

    private static Map<String, Object> ioc = new ConcurrentHashMap<>();

    public static Object getBean(String className) {
        synchronized (ioc) {
            if (!ioc.containsKey(className)) {
                Object obj = null;
                try {
                    obj = Class.forName(className).newInstance();
                    ioc.put(className, obj);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return ioc.get(className);
        }
    }


}

5 JDK 源码

在这里插入图片描述


http://www.niftyadmin.cn/n/4556707.html

相关文章

帮我解决一下C++的问题啊 高手来啊~

你们主函数&#xff1a;void main(){bool b_sushu;for(int i100;i<200;i){b_sushusushu(i);if(b_sushu){cout<<m<<"is a primer"<<endl;}else{cout<<m<<"is not a primer"<<endl; }}} #include<iostream.h>i…

网易云易盾发布多国家多语种内容安全服务,助力中国互联网出海

中国互联网企业迎来“大航海时代”&#xff0c;越来越多的中国互联网产品走向海外&#xff0c;特别是东南亚的印尼、泰国等移动互联网新兴市场。据《中国移动互联网出海环境全揭秘报告》&#xff0c;2017年Q4中国互联网出海企业就达到720多家&#xff0c;出海应用2268个&#x…

设计模式 – 代理模式

1 概述 在生活中&#xff0c;我们经常见到这样的场景&#xff0c;如&#xff1a;租房中介、售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日志监听等&#xff0c;这些都是代理模式的实际体现。代理模式&#xff08;Proxy Pattern&#xff09;的定义也非常简单&#xff0c…

设计模式 – 委派模式

委派模式 委派模式不属于 GOF23 种设计模式中。委派模式&#xff08;Delegate Pattern&#xff09;的基本作用就是负责任务的调用和分配任务&#xff0c;跟代理模式很像&#xff0c;可以看做是一种特殊情况下的静态代理 的全权代理&#xff0c;但是代理模式注重过程&#xff0…

谁帮我弄个C++的小问题啊 高手来啊

"; cin>>more; } else { cout<<"/n/n请输入华氏度&#xff1a;"; cin<<user; cout<<"/n华氏度是&#xff1a;"<<user<<" /n华氏度是&#xff1a;"<<user/5*932; cout<<"想继续转换请…

设计模式 – 策略模式

策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是指定义了算法家族、分别封装起来&#xff0c;让它们之间可以互 相替换&#xff0c;此模式让算法的变化不会影响到使用算法的用户。 使用场景 1、假如系统中有很多类&#xff0c;而他们的区别仅仅在于他们的行为…

文件默认权限umask掩码

umask命令 作用&#xff1a;用于显示、设置文件的缺省权限 格式&#xff1a;umask [-S]  -S表示以rwx形式显示新建文件缺省权限 系统的默认掩码是0022 文件创建时的默认权限 0666 - umask 目录创建时的默认权限 0777 - umask 所以创建文件的权限是 0666 - 0022 0644   …

谢谢啦~ 哪个高手帮我用C++解决个小问题啊

0)/*利用辗除法 y)<<endl;} y)<<endl; cout<<"他们的最小公倍数为: "<<Gbs(x y; cout<<"输入要求的两个数&#xff1a;"&#xff1b; cin>>x>>; cout<<"他们的最大公约数为: "<<Gcd(x b)…