• 设计模式学习--单例模式


    概念

    创建单一实例,保证类在程序中只有一个实例。

    需要做到

    • 构造方法私有 (+ private修饰符)
    • 在类中创建对象(为了类的内部调用需要+static修饰;为了防止外部通过类名调用需要+private)
    • 给外部提供公共的访问方法(为了外界能获取到此方法,需要+static修饰)

    饿汉式单例模式

    一句话:类加载的时候对象已经创建好了

    public class Student {
    	private Student() {}
    	private static Student student = new Student();
    	public static Student getStudent(){
    		return student;
    	}
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    

    懒汉式单例模式

    一句话:什么时候要对象,就什么时候创建对象

    public class Student {
    	private Student() {}
    	private static Student student=null;
    	public synchronized static Student getStudent(){
    		if(student == null){
    			student = new Student();
    		}
    		return student;
    	}
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    

    推荐使用的是饿汉式单例模式

    分析:
    • 懒汉式单例模式的问题:
    1. 线程安全问题怎么产生的?(多线程访问getStudent时可能某个进程获取到的对象为null)
    2. 线程安全问题怎么解决的?(+关键字synchronized)
    

    案例

    学生类
    package design03;
    
    /**
     * 这是一个学生类
     * @author wangtengfei-ds
     *
     */
    public class Student {
    	/**
    	 * 私有化构造方法,不允许外界创建此类的对象
    	 */
    	private Student() {
    		
    	}
    	
    	/**
    	 * 在类的内部创建类的对象
    	 */
    	private static Student student = new Student();
    	
    	/**
    	 * 为外界提供获取类的对象的方法
    	 * @return student对象
    	 */
    	public static Student getStudent(){
    		return student;
    	}
    	
    	/**
    	 * 提供一个对象的方法案例
    	 */
    	public void say(){
    		System.out.println("我叫A学生");
    	}
    }
    
    
    测试学生类
    package design03;
    
    /**
     * 单例模式测试小程序
     * @author wangtengfei-ds
     *
     */
    public class StudentTest {
    	public static void main(String[] args) {
    		Student s1 = Student.getStudent();
    		Student s2 = Student.getStudent();
    		System.out.println(s1==s2);//true
    		s1.say();
    		s2.say();
    	}
    }
    
  • 相关阅读:
    leetcode 375. Guess Number Higher or Lower II
    leetcode 374. Guess Number Higher or Lower
    转 PHP中exec、system等函数调用linux命令问题
    转 PHP 使用 Redis
    转 Vim操作
    转 php simple test
    转 手把手教你最简单的开源项目托管GitHub入门教程
    Bootstrap开启模态框后对数据处理(标记模态框的开启与关闭状态)
    java必会的英语单词
    Service和Servlet的区别
  • 原文地址:https://www.cnblogs.com/wtf0215-golang/p/5867924.html
Copyright © 2020-2023  润新知