设计模式(一)---单例模式

单例设计模式我这里就只写五种方式进行实现

1、饿汉模式

饿汉模式天生线程安全。因为一开始就创建了对象

步骤:

1、一开始就使用static 方法创建自己

2、将构造函数私有

3、对外提供一个方法获取到自己

/**
 * 单例模式创建方式一: 饿汉模式创建
 *
 * @author liyue
 * @date 2020/2/12 15:44
 */
public class User {

    //1.一开始就创建对象
    public static User user = new User();

    //2.私有化构造方法

    private User() {

    }

    //3.提供一个对外的可以获取当前对象的方法

    public static User getUser() {

        return user;
    }

}

2、懒汉模式

创建步骤:

  1. 一开始只使用static 定义自己

  2. 构造方法私有

  3. 对外提供一个可以获取到对象的接口,如果该对象为null就重新new一个对象返回。如果对象不为

    null就放当前对象。

/**
 * 单例模式创建方式二: 懒汉模式
 *
 * @author liyue
 * @date 2020/2/12 15:50
 */
public class User {

    //1.开始只定义自己
    private static User user;

    //2.构造方法私有化
    private User() {

    }

    //3.对外提供一个可以获取到对象的方法
    public static User getUser() {

      //多线程访问的时候会线程不安全
        if (user == null) {

            user = new User();
            
            return user;
        }

        return user;
    }
}

3、加锁的懒汉模式

package com.leeue.sigle;

/**
 * 单例模式创建方式三: 线程安全加锁的 懒汉模式
 *
 * @author liyue
 * @date 2020/2/12 17:14
 */
public class User {

    private static User user;

    private User() {

    }

    // 加了 synchronized 锁 就可以保证只有一个线程进行访问。
    public static synchronized User getUser() {

        if (user == null) {

            user = new User();

            return user;
        }

        return user;
    }
}

4、懒汉模式双重校验锁方式实现

/**
 * 单例模式创建方式四: 双重校验锁饿汉模式
 *
 * @author liyue
 * @date 2020/2/12 17:17
 */
public class User {

    //加上volatile 关键字,user就对线程有了可见性
    private static volatile User user;

    private User() {

    }

    public static User getUser() {

        if (user == null) {

            //使用 synchronized 包裹代码块。双重判断。static 修饰的锁是字节码文件
            synchronized (User.class) {

                if (user == null) {

                    user = new User();

                    return user;
                }
            }
        }
        return user;
    }
}

5、使用枚举方式实现单例

在java中枚举是天生安全的

/**
 * 单例模式创建方式五: 使用枚举方式创建实现单例模式
 *
 * @author liyue
 * @date 2020/2/12 17:27
 */
public class User {

    //1.定义枚举里面复制创建对象
    private static enum UserEnum {

        GET_USER;

        private User user;

        private UserEnum() {

            user = new User();
        }

        public User getUser() {

            return user;
        }
    }

    //2.私有构造方法

    private User() {

    }

    //3.提供一个对外获取对象的方法

    private static User getUser() {

        return UserEnum.GET_USER.getUser();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章