JAVA实现单例模式之饿汉式和懒汉式

设计模式

A:设计模式概述
	设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编写、代码设计经验的总结。
	使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性以及代码的结构更加清晰.
B:设计模式分类
	创建型模式(创建对象的):	单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
	行为型模式(对象的功能):	适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
	结构型模式(对象的组成):	模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

首先明确什么是单例模式,简单来说就是:内存中只存在该类的一个对象

——主要:
	1.饿汉式(线程安全,调用率高,但是,不能延迟加载。)
	2.懒汉式(线程安全,调用效率不高,可以延时加载。)
——其他:
	1.双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
	2.静态内部类式(线程安全,调用效率高。但是,可以延时加载)
    3.枚举式(线程安全,调用率高,不能延时加载)
 
如何选用?
——单例对象 占用资源少,不需要 延时加载
	枚举式 好于 饿汉式
——单例对象 占用资源大,需要延时加载
	静态内部类式 好于 懒汉式

饿汉式与懒汉式比较:

	饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
	懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的 推荐使用第一种 。
	从实现方式来讲他们最大的区别就是懒汉式是延时加载,
	他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,

	饿汉式无需关注多线程问题、写法简单明了、能用则用。
	但是它是加载类时创建实例、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,
	因为这个类一加载则把所有实例不管用不用一块创建。懒汉式的优点是延时加载、缺点是应该用同步

代码实现饿汉式和懒汉式

        //单例模式:内存中直存在该类的一个对象
        //单例设计模式之饿汉式
        Teacher teacher = Teacher.getTeacher();
        Teacher teacher1 = Teacher.getTeacher();
        System.out.println(teacher==teacher1);
        //单例模式之懒汉式
        Student student = Student.getStudent();
        Student student1 = Student.getStudent();
        System.out.println(student==student1);

public class Student {
    private static Student student = null;
    //私有构造
    private Student() {
    }
    //给外界提供一个公共的静态方法,返回该类的一个对象
    //加入synchronized是为了防止多线程情况下,出现多个该类对象
    public synchronized static Student getStudent(){
        if(student==null){
            student = new Student();
        }
        return student;
    }

}

public class Teacher {
    private static Teacher teacher = new Teacher();
    private Teacher() {
    }
    public static Teacher getTeacher(){
        return teacher;
    }
}

JAVA实现单例模式之饿汉式和懒汉式_第1张图片

你可能感兴趣的:(单例模式)