首页 > 其他分享 >单例模式的5种实现方式

单例模式的5种实现方式

时间:2022-11-10 10:48:01浏览次数:39  
标签:方式 模式 instance2 instance3 static private 单例 Test sayHi


public class Test {

    // 饿汉式,线程安全,但提前加载,浪费内存
    private static Test instance = new Test();

    private static Test getInstance() {
        return instance;
    }

    private static Test instance2;

    // 懒汉式,线程不安全,但使用时加载省内存
    private static Test getInstance2(){
        if (instance2 == null) {
            instance2 = new Test();
        }
        return instance2;
    }

    // 懒汉式DLC,double check lock 双重检测锁(DLC),线程安全
    // 注意:instance3 要用volatile修饰才能保证线程安全
    private static volatile Test instance3;

    private static Test getInstance3(){
        if (instance3 == null){
            synchronized (Test.class) {
                if (instance3 == null){
                    instance3 = new Test();
                }
            }
        }
        return instance3;
    }

    //内部类方式,推荐,线程安全,调用getInstance4时才加载省内存
    static class TestInner {

        private static final Test INSTANCE4 = new Test();

        public static Test getInstance4() {
            return TestInner.INSTANCE4;
        }
    }

    // 枚举式,极力推荐,线程安全且只会在使用时装载一次,且序列化、反序列化、反射或克隆都不会创建对象
    enum TestEnum{
        INSTANCE;

        final Test instance5;

        TestEnum(){
            this.instance5 = new Test();
        }

        public Test getInstance5(){
            return instance5;
        }
    }

    public void sayHi(){
        System.out.println("Hi");
    }


    public static void main(String[] args) {
        Test instance = Test.getInstance();
        instance.sayHi();

        Test instance2 = Test.getInstance2();
        instance2.sayHi();

        Test instance3 = Test.getInstance3();
        instance3.sayHi();

        Test instance4 = Test.TestInner.getInstance4();
        instance4.sayHi();

        Test instance5 = TestEnum.INSTANCE.getInstance5();
        instance5.sayHi();
    }
}

标签:方式,模式,instance2,instance3,static,private,单例,Test,sayHi
From: https://www.cnblogs.com/lixuelong/p/16876285.html

相关文章

  • 什么才是最鲁棒的成长方式?
    降低自己的消费需求,提高自己的创作需求——这是一种状态,而不是一种方法。当你能够从创造中获得幸福时,你就获得了抵御外部风险最强大的武器。如何达到这种状态?当你在现实......
  • 简单排序方式
    冒泡排序对于数组个数比较少的,我们可以采用冒泡排序的方法来进行排序,他的原理其实是利用两层循环来进行比较,如果n个数要进行排序,那至少要进行n-1次的回合,而且每次需要排n-......
  • 初识设计模式 - 访问者模式
    简介访问者设计模式(VisitorDesignPattern)的定义是,允许一个或多个操作应用到一组对象上,解耦操作和对象本身。在使用访问者模式的时候,被访问的元素通常不是单独存在的,它......
  • 工程中的耦合与解耦方式
    复用与解耦,是推动软件工程技术发展的两大思想溯源。谈到解耦,就不能不先谈耦合。耦合,是指两个软件组件之间有相互影响的或强或弱的关联关系。软件组件的范围涉及:函数、类、......
  • 浅谈PHP设计模式的迭代器模式
    简介:迭代器模式,是行为型的设计模式。提供一中方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。适用场景:除了学习,在PHP中几乎没有应用场景。优......
  • Java创建对象的5种方式
    new:最常见的方法Employeeemp1=newEmployee();newInstance()用newInstance()创建对象分2种1、使用class类的newInstance()方法需要有一个无参的构造方法,这个n......
  • 【python】程序员最浪漫的表白方式,将情书写在她的照片里
    前言大家早好、午好、晚好吖~这不光棍节快到了,表弟准备写一封情书给他的女神,想在光棍节之前脱单。为了提高成功率,于是跑来找我给他参谋参谋,本来我是不想理他的。不过......
  • 设计模式---责任链模式
    简述将各个功能拆分后分别封装(各功能解耦),需要时可自由组合(包括执行顺序)话不多说,看个优化案例吧。优化案例最初版以下是模拟客户端想服务端发送请求的业务流程。......
  • 软件设计模式白话文系列(五)建造者模式
    1、描述将一个对象的构造过程进行封装,并按照一定顺序进行构造。通俗的讲,假如要创建电脑的对象,那么各个实例的属性不同,也就是电脑的配置各不相同.这个时候可以考虑用构......
  • 单例模式实现的多种方式,pickle序列化模块,选课系统整体搭建
    目录单例模式实现的多种方式,pickle序列化模块,选课系统整体搭建今日内容概要今日内容详细单例模式实现的多种方式pickle序列化模块选课系统需求分析功能提炼选课系统架构设......