# 单例模式
构造函数私有化。
私有化是为了阻止外部代码直接通过 new 关键字来实例化对象,从而确保单例唯一性,防止有子类继承破坏单例模式的唯一性
改单列对象必须由单例类自己创建
内部提供一个方法给外界调用对象.
# 饿汉
普通实现
package com.msq.pattern.singe;
/**
* 饿汉模式
* 在类加载的时候就创建的,没有线程安全的问题
*/
public class HungrySingeDemo {
// 静态成员变量,在类加载的时候已经创建完成
private static HungrySingeDemo hungrySingeDemo = new HungrySingeDemo();
/**
* 私有化构造函数,确保对象唯一性
* 就是确保外界无法通过直接调用new 来创建对象,只能通过我们指定的方法去调用。
*/
private HungrySingeDemo() {
}
/**
* 提供给外界获取对象的方法, 必须有单例类自己实现,并返回对象。
*/
public static HungrySingeDemo getHungrySingeDemo(){
return hungrySingeDemo;
}
/**
* com.msq.pattern.singe.HungrySingeDemo@1b6d3586
* com.msq.pattern.singe.HungrySingeDemo@1b6d3586
* true
* @param args
*/
public static void main(String[] args) {
HungrySingeDemo hungrySingeDemo = HungrySingeDemo.getHungrySingeDemo();
System.out.println(hungrySingeDemo);
System.out.println(HungrySingeDemo.getHungrySingeDemo());
System.out.println(HungrySingeDemo.getHungrySingeDemo() == hungrySingeDemo);
}
}
枚举实现
package com.msq.pattern.singe;
/**
* 枚举是饿汉式的
* 枚举类型在Java中是线程安全的,且在类加载的过程中保证只会被实例化一次
*/
public enum EnumHungrySingeDemo {
INSTANCE;
private String name;
private int age;
// get/set
@Override
public String toString() {
return "EnumHungrySingeDemo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/**
* Singleton{name='aa', age=13}
* Singleton{name='aa', age=13}
* true
* Singleton{name='aa', age=13}
* @param args
*/
public static void main(String[] args) {
EnumHungrySingeDemo singleton = EnumHungrySingeDemo.INSTANCE;
singleton.setAge(12);
EnumHungrySingeDemo singleton1 = EnumHungrySingeDemo.INSTANCE;
singleton1.setName("aa");
singleton1.setAge(13);
System.out.println(singleton1);
System.out.println(singleton);
System.out.println(singleton == singleton1);
System.out.println(singleton.toString());
}
}
# 懒汉
package com.msq.pattern.singe;
/**
* 懒汉式模式
* 在需要的时候创建对象
*/
public class FullSingeDemo {
// volatile 关键字,确保多线程可见性。
private static volatile FullSingeDemo fullSingeDemo;
private FullSingeDemo() { }
/**
* 在被第一次调用的是否创建
* 问题1: 可能存在多个线程同时调用,一起创建。
* 双重校验锁
* @return
*/
public static FullSingeDemo getInstance(){
if (fullSingeDemo == null) {
synchronized (FullSingeDemo.class){
if (fullSingeDemo == null){
fullSingeDemo = new FullSingeDemo();
}
}
}
return fullSingeDemo;
}
}
标签:name,System,模式,HungrySingeDemo,单例,println,设计模式,public,out
From: https://blog.csdn.net/m0_46271812/article/details/140079408