设计模式学习——单例模式

获取单例模式的几种推荐方法

一、通过静态代码块来获取单例对象

public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getSingleton();
Singleton singleton2 = Singleton.getSingleton();
//比较两个对象是否相等
System.out.println(singleton1.hashCode());
System.out.println(singleton2.hashCode());
}
}

/**
* 将要获取的单例对象
*/
class Singleton {
//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象
private Singleton() {
}

private static Singleton singleton;

static {
//静态代码块中创建对象
singleton = new Singleton();
}

/**
* 提供公有方法来获取单例对象
*/
public static Singleton getSingleton() {
return singleton;
}
}

缺点:对内存消耗较大

推荐在单线程中,且能确定所有类的对象都会被创建时使用


多线程下推荐的创建单例的方法

二、通过双重检测来获取单例对象

public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getSingleton();
Singleton singleton2 = Singleton.getSingleton();
//比较两个对象是否相等
System.out.println(singleton1.hashCode());
System.out.println(singleton2.hashCode());
}
}

/**
* 将要获取的单例对象
*/
class Singleton {
//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

private Singleton() {
}

private static volatile Singleton singleton;

/**
* 双重检测,保证多线程下的单例
*/
public static Singleton getSingleton() {
if(singleton == null) {
synchronized (Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}

三、通过静态内部类来创建单例对象

public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getSingleton();
Singleton singleton2 = Singleton.getSingleton();
//比较两个对象是否相等
System.out.println(singleton1.hashCode());
System.out.println(singleton2.hashCode());
}
}

/**
* 将要获取的单例对象
*/
class Singleton {
//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

private Singleton() {
}

/**
* 在静态内部类中创建单例对象
*/
static class GetSingleton {
private static final Singleton SINGLETON = new Singleton();
}

public static Singleton getSingleton() {
return GetSingleton.SINGLETON;
}
}

四、通过枚举的方法获取单例对象

public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.INSTANCE;
Singleton singleton2 = Singleton.INSTANCE;
singleton1.say();
//比较两个对象是否相等
System.out.println(singleton1.hashCode());
System.out.println(singleton2.hashCode());
}
}

enum Singleton {
/**
* 将要获取的单例对象
*/
INSTANCE;
public void say() {
System.out.println("hello world");
}
}

posted @ 2020-02-20 15:05  NyimaC  阅读(124)  评论(0)    收藏  举报