zoukankan      html  css  js  c++  java
  • 单例设计模式

    @

    一、概念叙述

    单例模式是一种常用的软件设计模式,使用单例模式,可以保证为一类只生成唯一的实例对象。也就是说,整个程序空间中,该类只存在一个实例对象。

    二、先看个问题

    我们通常在实例化对象是,通常是通过去new构造器方法获取一个类的实例化对象。这样就会出现一个问题:那就是每次创建的实例对象的内存地址都不一样。

    public class Student {
    	private String name;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

    在这里插入图片描述
    接下来单例模式就可以解决这个问题。

    三、单例模式实现

    (一)、饿汉模式

    package 单例模式;
    /**
     * 饿汉模式
     * 1、初始化类对象
     * 2、私有化构造器
     * 3、通过静态方法还会
     */
    public class Student {
    //	初始化对象,当类加载时,就已经把student对象加载到了内存中
    	private static Student student = new Student();
    	private String name;
    //	第一步私有化构造器
    	private Student() {
    		
    	}
    //	通过静态方法返回对象
    	public static Student getInstance() {
    		return student;
    	}
    }
    

    在这里插入图片描述
    饿汉模式特点: 执行效率较高,会占用稍稍占用一点内存空间

    (二)、懒汉模式

    package 单例模式;
    /*
     * 懒汉式
     * 1、先去创建对象
     * 2、私有化构造
     * 3、静态方法实例化对象,并返回
     * */
    public class Student1 {
    //	先创建对象,不去实例化对象
    	private static Student1 student1 = null;
    //	私有构造
    	private Student1() {
    		
    	}
    //	静态方法返回对象
    	private static Student1 getInstance() {
    //		当该方法被调用的时候再去实例化对象
    		if(student1 == null) {
    			student1 = new Student1();
    		}
    		return student1;
    	}
    
    }
    

    在这里插入图片描述
    懒汉模式特点: 懒汉模式不支持多线程,只支持单线程,不能保证线程的安全性

    (三)、双重校验锁

    双重校验锁就是解决懒汉模式不支持多线程的问题,我们来分析一下为什么懒汉模式不支持多线程!
    在这里插入图片描述
    双重校验锁
    在这里插入图片描述
    具体实现

    package 单例模式;
    /*
     * 双重校验锁
     * */
    public class Student1 {
    //	先创建对象,不去实例化对象
    	private static Student1 student1 = null;
    //	私有构造
    	private Student1() {
    		
    	}
    //	静态方法返回对象
    	public static Student1 getInstance() {
    //		当该方法被调用的时候再去实例化对象
    		if(student1 == null) {
    //			设置同步代码块
    			synchronized (Student1.class) {
    //				再一次进行判断
    				if(student1 == null) {
    					student1 = new Student1();
    				}
    			}
    		}
    		return student1;
    	}
    
    }
    ~~~![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402144821143.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY3NjkzNQ==,size_16,color_FFFFFF,t_70)
  • 相关阅读:
    腾讯测试开发岗一面二面上机编程题
    软件测试工程师职业发展漫谈
    学习 Python,这 22 个包怎能不掌握?
    Loj514「LibreOJ β Round #2」模拟只会猜题意
    后缀数组模板(倍增)
    USACO06DEC 牛奶模式
    BZOJ3680 JSOI2004 平衡点
    loj6278 数列分块入门题2
    loj6277 数列分块入门题1
    Codeforces 383C Propagating tree, 线段树, 黑白染色思想
  • 原文地址:https://www.cnblogs.com/geq2020/p/12630272.html
Copyright © 2011-2022 走看看