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

    1、单例设计模式的简介

    采取一定的方法保证在整个软件系统中,某个类只存在一个对象实例

    比如Hibernate的SessionFactory,他作为数据存储源的代理,负责创建Session对象,但是SessionFactory并不是轻量级的

    ,一般情况下,一个项目只需要一个SessionFactory就足够了,这就会使用到单例模式

    2 单例设计模式的八种实现方式

    clipboard

     

    3 饿汉式(静态常量)

    /**
     * @author houChen
     * @date 2020/9/19 15:44
     * @Description:    单例模式的饿汉式写法
     */
    public class SingletonTest01 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
        }
    }
    
    
    class Singleton{
    
        //1、私有化构造器,这样外部就不能通过构造器来创建对象
        private Singleton(){
    
        }
    
        //2、本类内部创建对象实例
        private final static Singleton instance = new Singleton();
    
        //3、对外提供一个共有的静态方法,返回对象实例
        public static Singleton getInstance(){
            return instance;
        }
    
    }

    4 饿汉式(静态代码块)

    /**
     * @author houChen
     * @date 2020/9/19 15:44
     * @Description:    单例模式的饿汉式写法(静态代码块)
     */
    public class SingletonTest02{
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
        }
    }
    
    class Singleton{
    
        //1、私有化构造器,这样外部就不能通过构造器来创建对象
        private Singleton(){
    
        }
    
        //2、本类内部创建对象实例
        private static Singleton instance;
    
        //3、在静态代码块中创建单例对象
        static {
            instance = new Singleton();
        }
    
        //4、对外提供一个共有的静态方法,返回对象实例
        public static Singleton getInstance(){
            return instance;
        }
    
    }

    5 懒汉式(线程不安全)

    public class SingletonTest03 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    class Singleton{
    
        private static Singleton instance;
    
        private Singleton(){};
    
        //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
        public static Singleton getInstance(){
         // 多个线程进来时,会创建多个 Singleton实例,这就违反了单例模式的设计原则
    if(instance==null){ instance = new Singleton(); } return instance; } }

    clipboard

    优缺点:

    clipboard

    6 懒汉式(使用同步方法解决线程安全问题)

    /**
     * @author houChen
     * @date 2020/9/19 16:14
     * @Description:  懒汉式  同步方法解决线程安全问题
     */
    public class SingletonTest04 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    class Singleton{
    
        private static Singleton instance;
    
        private Singleton(){};
    
        //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
        public static synchronized Singleton getInstance(){
            if(instance==null){
                instance = new Singleton();
            }
            return instance;
        }
    }

    7 懒汉式(使用同步代码块)

    public class SingletonTest04 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    class Singleton{
    
        private static Singleton instance;
    
        private Singleton(){};
    
        //提供一个静态的公有方法,当使用到该方法时,才会去创建instance
        public static Singleton getInstance(){
            if(instance==null){
                synchronized(Singleton.class){
                    instance = new Singleton();
                }
            }
            return instance;
        }
    }

    8 双重检查

    /**
     * @author houChen
     * @date 2020/9/19 16:25
     * @Description:     双重检查实现单例模式
     */
    public class SingletonTest06 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    class Singleton{
    
        // volatile: 轻量级的synchronized, 由它修饰的变量在发生变化后会立即刷新到主存
        private static volatile Singleton instance;
    
        private Singleton(){};
    
    
        public static Singleton getInstance(){
            if(instance==null){
                synchronized (Singleton.class){
                    if(instance==null){
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    9 静态内部类

    /**
     * @author houChen
     * @date 2020/9/19 16:59
     * @Description:  静态内部类实现单例模式
     */
    public class SingletonTest07 {
        public static void main(String[] args) {
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    class Singleton{
        private Singleton(){
    
        }
    
        //写一个静态内部类,该类中有一个静态属性instance
        private static class SingletonInstance{
            private static final Singleton instance= new Singleton();
        }
    
        //提供一个静态的共有方法
        public static Singleton getInstance(){
            return  SingletonInstance.instance;
        }
    }

     

    10 枚举实现单例模式

    /**
     * @author houChen
     * @date 2020/9/19 17:06
     * @Description:  枚举实现单例模式
     */
    public class SingletonTest08 {
        public static void main(String[] args) {
    
            Singleton instance = Singleton.INSTANCE;
            Singleton instance1 = Singleton.INSTANCE;
            System.out.println(instance==instance1);
    
            System.out.println(instance.hashCode());
            System.out.println(instance1.hashCode());
        }
    }
    
    //使用枚举 可以实现单例
    enum Singleton{
        INSTANCE;
    
        public void sayOk(){
            System.out.println("say ok~");
        }
    }
  • 相关阅读:
    无线安全课堂:手把手教会你搭建伪AP接入点
    转载——开阔自己的视野,勇敢的接触新知识
    关于系统架构的一些总结
    MessageBox.Show()如何换行
    不患寡而患不均
    由CHAR(2)引发的BUG
    DataRow.RowState 属性
    C# 使用TimeSpan计算两个时间差
    利用反射调出其他项目的界面
    DB2 中将date类型的转换成timestamp
  • 原文地址:https://www.cnblogs.com/houchen/p/13728321.html
Copyright © 2011-2022 走看看