

了解23种设计模式-单例模式
source link: https://blog.lacia.cn/2019/11/05/%E4%BA%86%E8%A7%A323%E7%A7%8D%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

了解23种设计模式-单例模式
- 饿汉式
public class Mgr01 {
private static final Mgr01 INSTANCE = new Mgr01();
private Mgr01(){}
private static Mgr01 getInstance(){return INSTANCE;}
public void m(){
System.out.println("m");
}
public static void main(String[] args) {
Mgr01 m1 = Mgr01.getInstance();
Mgr01 m2 = Mgr01.getInstance();
System.out.println(m1 == m2);
}
}类加载到内存后就实例化一个单例 , JVM 保证线程安全
缺点: 不管是否用到,类装载时就完成实例化 (通常问题不大,写法简单) - 懒汉式
public class Mgr02 {
private volatile static Mgr02 INSTANCE;
private Mgr02(){};
/**
* 可以使用线程锁的方式(synchronized 修饰此方法)解决,但是性能会下降
* @return
*/
public static Mgr02 getInstance(){
if (INSTANCE == null) {
// 或者在此处加锁,解决线程安全问题
synchronized (Mgr02.class){
if (INSTANCE == null ){
INSTANCE = new Mgr02();
}
}
}
return INSTANCE;
}
public void m(){
System.out.println("m");
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
// 同一个类的 不同对象,它的 hashCode 是不同的
System.out.println(Mgr02.getInstance().hashCode());
}).start();
}
}
}为了保证线程安全,写法相对饿汉式麻烦,但是只有在使用时才会实例化
- 静态内部类
public class Mgr03 {
private Mgr03(){}
private static class Mgr03Holder {
private static final Mgr03 INSTANCE = new Mgr03();
}
public static Mgr03 getInstance() {
return Mgr03Holder.INSTANCE;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
// 同一个类的 不同对象,它的 hashCode 是不同的
System.out.println(Mgr03.getInstance().hashCode());
}).start();
}
}
}与饿汉式类似,都是由 JVM 保证线程安全,但静态内部类是延迟加载
- 枚举
public enum Mgr04 {
//枚举单例
INSTANCE;
public void m(){
System.out.println("m");
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
// 同一个类的 不同对象,它的 hashCode 是不同的
System.out.println(Mgr04.INSTANCE.hashCode());
}).start();
}
}
}枚举单例,解决线程同步,解决反序列化(不能通过反射拿到多个实例,枚举没有构造方法)
Recommend
-
56
1.单例模式(Singleton Pattern) 定义:Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代...
-
25
终于写完了,写了一个多月,每一种模式都是查阅各种资料总结出,本文较长,希望对你有所帮助,如果对你有用,请点赞支持一把,也是给予我写作的动力 设计模式简介 设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员...
-
12
23种设计模式 -比喻
-
11
23种设计模式 - 单例模式 1.关于单例模式的一些说明 单例模式:确保一个类最多只有一个实例,提...
-
10
一张图快速了解23种设计模式
-
8
实践GoF的23种设计模式:装饰者模式 原创 华为云开发者联盟 2022-06-30 1...
-
5
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模...
-
6
确保一个类只有一个实例,并提供对该实例的全局访问。如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建...
-
9
GoF 23种设计模式速查表 22-12-24 b...
-
6
工厂方法模式(Factory Method Pattern) 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把对象的实例化推迟到子类。 代码示例:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK