`

1. 创建型模式 (1) 单例模式

阅读更多
1. 创建型模式 (3) 单例模式

单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。
    (1)在任何情况下,单例类永远只有一个实例存在
    (2)单例需要有能力为整个系统提供这一唯一实例


1. 饿汉式单例模式

线程安全

饿汉式单例是指在方法调用前,实例就已经创建好了。


package com.andrew.pattern0101.singleton.modal01;

/**
 * 1.饿汉式单例模式
 * 线程安全
 * 饿汉式单例是指在方法调用前,实例就已经创建好了。
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = new SingletonTest();
    
    private SingletonTest(){};
    
    public static SingletonTest getInstance() {
        return instance;
    }
}


package com.andrew.pattern0101.singleton.modal01;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


860588932
860588932
860588932
860588932
860588932
860588932
860588932
860588932
860588932
860588932


2. 懒汉式单例模式

(1) 简单懒汉式单例模式

线程可能不安全

懒汉式单例是指在方法调用获取实例时才创建实例。


package com.andrew.pattern0101.singleton.modal0201;

/**
 * 2.懒汉式单例模式
 * (1)简单懒汉式单例模式
 * 线程可能不安全
 * 懒汉式单例是指在方法调用获取实例时才创建实例。
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        // 下面代码无法在多线程下保证实例的唯一性
        if (null == instance) {
             instance = new SingletonTest();
        }
        return instance;
    }
}


package com.andrew.pattern0101.singleton.modal0201;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


257688302
1483688470
1483688470
1483688470
860588932
860588932
257688302
257688302
257688302
257688302


(2) 有间隔的懒汉式单例模式

线程不安全

懒汉式单例是指在方法调用获取实例时才创建实例。

       
package com.andrew.pattern0101.singleton.modal0202;

/**
 * 2.懒汉式单例模式
 * (2)有间隔的懒汉式单例模式
 * 线程不安全
 * 懒汉式单例是指在方法调用获取实例时才创建实例。
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        // 下面代码无法在多线程下保证实例的唯一性
        // 应当在创建实例之前可能会有一些准备性的耗时工作
        // 但是仍然无法保证单例的线程安全
        try {
            if (null != instance) {
            } else {
                Thread.sleep(300);
                instance = new SingletonTest();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }    
}


package com.andrew.pattern0101.singleton.modal0202;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


474695494
2030908035
194025646
313586000
2049977720
1483688470
644512395
257688302
1388138972
724219370


3. 线程安全的懒汉式单例模式

(1) 使用同步锁机制synchronized

线程安全

懒汉式单例是指在方法调用获取实例时才创建实例。
为了保证线程安全,要使用同步锁机制,在方法中声明synchronized关键字


package com.andrew.pattern0101.singleton.modal0301;

/**
 * 3.线程安全的懒汉式单例模式
 * (1)使用同步锁机制synchronized
 * 线程安全
 * 懒汉式单例是指在方法调用获取实例时才创建实例。
 * 为了保证线程安全,要使用同步锁机制,在方法中声明synchronized关键字
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public synchronized static SingletonTest getInstance() {
        // 应当在创建实例之前可能会有一些准备性的耗时工作,并声明同步锁synchronized关键字
        // 但是这种方法效率很低
        try {
            if (null != instance) {
            } else {
                Thread.sleep(300);
                instance = new SingletonTest();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }
}


package com.andrew.pattern0101.singleton.modal0301;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646


(2) 使用同步代码块

线程安全

懒汉式单例是指在方法调用获取实例时才创建实例。
为了保证线程安全,提高同步锁效率,使用同步代码块实现

   
package com.andrew.pattern0101.singleton.modal0302;

/**
 * 3.线程安全的懒汉式单例模式
 * (2)使用同步代码块
 * 线程安全
 * 懒汉式单例是指在方法调用获取实例时才创建实例。
 * 为了保证线程安全,提高同步锁效率,使用同步代码块实现
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        // 应当在创建实例之前可能会有一些准备性的耗时工作,并使用synchronized同步代码块来提高效率
        try {
            synchronized (SingletonTest.class) {
                if (null != instance) {
                } else {
                    Thread.sleep(300);
                    instance = new SingletonTest();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }    
}


package com.andrew.pattern0101.singleton.modal0302;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


257688302
257688302
257688302
257688302
257688302
257688302
257688302
257688302
257688302
257688302


(3) 使用同步代码块(针对某些重要的代码进行单独的同步,而不是全部进行同步)

线程可能不安全

懒汉式单例是指在方法调用获取实例时才创建实例。
为了保证线程安全,提高同步锁效率,使用同步代码块实现


package com.andrew.pattern0101.singleton.modal0303;

/**
 * 3.线程安全的懒汉式单例
 * (3)使用同步代码块(针对某些重要的代码进行单独的同步,而不是全部进行同步)
 * 线程可能不安全
 * 懒汉式单例是指在方法调用获取实例时才创建实例。
 * 为了保证线程安全,提高同步锁效率,使用同步代码块实现
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        try {
            if (null != instance) {
            } else {
                Thread.sleep(300);
                // 应当在创建实例之前可能会有一些准备性的耗时工作,并使用synchronized同步代码块来提高效率,但是只同步一部分
                synchronized (SingletonTest.class) {
                    instance = new SingletonTest();    
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }
}


package com.andrew.pattern0101.singleton.modal0303;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


2030908035
2049977720
474695494
860588932
1906199352
516266445
194025646
1388138972
724219370
313586000


(4) 双检查锁机制单例(推荐)

线程安全

<1>采用DCL的双检查锁机
<2>使用volatile关键字保其可见性


package com.andrew.pattern0101.singleton.modal0304;

/**
 * 3.线程安全的懒汉式单例
 * (4).双检查锁机制单例(推荐)
 * <1>采用DCL的双检查锁机
 * <2>使用volatile关键字保其可见性
 * 线程安全
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    // 使用volatile关键字保其可见性
    volatile private static SingletonTest instance = null;
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        try {
            if (null != instance) {
            } else {
                Thread.sleep(300);
                // 应当在创建实例之前可能会有一些准备性的耗时工作,并使用synchronized同步代码块来提高效率,但是只同步一部分
                synchronized (SingletonTest.class) {
                    // 在实例化之前进行二次检查
                    if (null == instance) {
                        instance = new SingletonTest();        
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return instance;
    }    
}


package com.andrew.pattern0101.singleton.modal0304;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


1483688470
1483688470
1483688470
1483688470
1483688470
1483688470
1483688470
1483688470
1483688470
1483688470


4. 使用静态内置类实现单例模式

线程安全


package com.andrew.pattern0101.singleton.modal04;

/**
 * 4.使用静态内置类实现单例模式    
 * 线程安全
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    // 内部类
    private static class SingletonTestHandler{
        private static SingletonTest instance = new SingletonTest();
    }
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        return SingletonTestHandler.instance;
    }    
}


package com.andrew.pattern0101.singleton.modal04;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


1798105197
1798105197
1798105197
1798105197
1798105197
1798105197
1798105197
1798105197
1798105197
1798105197


5. 序列化与反序列化的单例模式

(1) 未使用readResolve方法的单例模式

线程不安全

序列号对象的hashCode和反序列化后得到的对象的hashCode值不一样,说明反序列化后返回的对象是重新实例化的,单例被破坏了。

       
package com.andrew.pattern0101.singleton.modal0501;

import java.io.Serializable;

/**
 * 5.序列化与反序列化的单例模式
 * (1)未使用readResolve方法的单例模式
 * 线程不安全
 * 序列号对象的hashCode和反序列化后得到的对象的hashCode值不一样,说明反序列化后返回的对象是重新实例化的,单例被破坏了
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // 内部类
    private static class SingletonTestHandler{
        private static SingletonTest instance = new SingletonTest();
    }
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        return SingletonTestHandler.instance;
    }
}


package com.andrew.pattern0101.singleton.modal0501;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SaveAndReadForSingleton {

    public static void main(String[] args) {
        SingletonTest singletonTest = SingletonTest.getInstance();
        File file = new File("MySingleton.txt");
        try {  
            FileOutputStream fos = new FileOutputStream(file);  
            ObjectOutputStream oos = new ObjectOutputStream(fos);  
            oos.writeObject(singletonTest);  
            fos.close();  
            oos.close();  
            System.out.println(singletonTest.hashCode());  
        } catch (FileNotFoundException e) {   
            e.printStackTrace();  
        } catch (IOException e) {   
            e.printStackTrace();  
        }
        
        try {  
            FileInputStream fis = new FileInputStream(file);  
            ObjectInputStream ois = new ObjectInputStream(fis);  
            SingletonTest rsingletonTest = (SingletonTest) ois.readObject();  
            fis.close();  
            ois.close();  
            System.out.println(rsingletonTest.hashCode());  
        } catch (FileNotFoundException e) {   
            e.printStackTrace();  
        } catch (IOException e) {   
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {   
            e.printStackTrace();  
        }
    }    
}


1028566121
455659002


(2) 使用readResolve方法的单例模式

线程不安全

readResolve方法在反序列化时会被调用,实现反序列化

       
package com.andrew.pattern0101.singleton.modal0502;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 5.序列化与反序列化的单例模式
 * (2)使用readResolve方法的单例模式
 * 线程不安全
 * readResolve方法在反序列化时会被调用,实现反序列化
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // 内部类
    private static class SingletonTestHandler{
        private static SingletonTest instance = new SingletonTest();
    }
    
    private SingletonTest() {}
    
    public static SingletonTest getInstance() {
        return SingletonTestHandler.instance;
    }
    
    // 该方法在反序列化时会被调用,该方法不是接口定义的方法,有点儿约定俗成的感觉
    protected Object readResolve() throws ObjectStreamException {  
        System.out.println("调用了readResolve方法!");  
        return SingletonTestHandler.instance;   
    }
}


package com.andrew.pattern0101.singleton.modal0502;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SaveAndReadForSingleton {

    public static void main(String[] args) {
        SingletonTest singletonTest = SingletonTest.getInstance();
        File file = new File("MySingleton.txt");
        try {  
            FileOutputStream fos = new FileOutputStream(file);  
            ObjectOutputStream oos = new ObjectOutputStream(fos);  
            oos.writeObject(singletonTest);  
            fos.close();  
            oos.close();  
            System.out.println(singletonTest.hashCode());  
        } catch (FileNotFoundException e) {   
            e.printStackTrace();  
        } catch (IOException e) {   
            e.printStackTrace();  
        }
        
        try {  
            FileInputStream fis = new FileInputStream(file);  
            ObjectInputStream ois = new ObjectInputStream(fis);  
            SingletonTest rsingletonTest = (SingletonTest) ois.readObject();  
            fis.close();  
            ois.close();  
            System.out.println(rsingletonTest.hashCode());  
        } catch (FileNotFoundException e) {   
            e.printStackTrace();  
        } catch (IOException e) {   
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {   
            e.printStackTrace();  
        }
    }
}


1028566121
调用了readResolve方法!
1028566121


6. 使用static代码块实现模式

线程安全

静态代码块中的代码在使用类的时候就已经执行了,所以可以应用静态代码块的这个特性的实现单例设计模。


package com.andrew.pattern0101.singleton.modal06;

/**
 * 6.使用static代码块实现模式
 * 线程安全
 * 静态代码块中的代码在使用类的时候就已经执行了,所以可以应用静态代码块的这个特性的实现单例设计模。
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class SingletonTest {
    
    private static SingletonTest instance = null;
    
    private SingletonTest(){};
    
    static {
        instance = new SingletonTest();
    }
    
    public static SingletonTest getInstance() {
        return instance;
    }
}


package com.andrew.pattern0101.singleton.modal06;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(SingletonTest.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


2049977720
2049977720
2049977720
2049977720
2049977720
2049977720
2049977720
2049977720
2049977720
2049977720


7. 使用枚举数据类型实现单例模式

线程安全

枚举enum和静态代码块的特性相似,在使用枚举时,构造方法会被自动调用。

   
package com.andrew.pattern0101.singleton.modal07;

/**
 * 7.使用枚举数据类型实现单例模式
 * 线程安全
 * 枚举enum和静态代码块的特性相似,在使用枚举时,构造方法会被自动调用。
 * 
 * @author andrew
 * @date 2018/04/23
 */
public enum EnumFactory {
    
    singletonFactory;
    
    private SingletonTest instance;
    
    private EnumFactory(){
        // 枚举类的构造方法在类加载是被实例化  
        instance = new SingletonTest();  
    }
    
    public SingletonTest getInstance(){
        return instance;
    }
    
}

class SingletonTest {
    // 需要获实现单例的类,比如数据库连接Connection
    public SingletonTest(){}
}


package com.andrew.pattern0101.singleton.modal07;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(EnumFactory.singletonFactory.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646


8. 完善使用enum枚举实现单例模式

线程安全
不暴露枚举类实现细节

   
package com.andrew.pattern0101.singleton.modal08;

/**
 * 8.完善使用enum枚举实现单例模式
 * 线程安全
 * 不暴露枚举类实现细节
 * 
 * @author andrew
 * @date 2018/04/23
 */
public class ClassFactory {
    
    private enum EnumSingletonTest {
        
        singletonFactory;
        
        private SingletonTest instance;
        
        private EnumSingletonTest() {
            // 枚举类的构造方法在类加载是被实例化
            instance = new SingletonTest();
        }
        
        public SingletonTest getInstance(){
            return instance;
        }
    }
    
    public static SingletonTest getInstance(){  
        return EnumSingletonTest.singletonFactory.getInstance();  
    }
}

class SingletonTest {
    // 需要获实现单例的类,比如数据库连接Connection
    public SingletonTest(){};
}


package com.andrew.pattern0101.singleton.modal08;

public class ThreadTest extends Thread {
    
    @Override
    public void run() {
        System.out.println(ClassFactory.getInstance().hashCode());
    }
    
    public static void main(String[] args) {
        ThreadTest[] tts = new ThreadTest[10];
        for (int i = 0; i < tts.length; i++) {
            tts[i] = new ThreadTest();
        }
        for (int j = 0; j < tts.length; j++) {
            tts[j].start();
        }
    }
}


194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646
194025646


总结:推荐使用 3.线程安全的懒汉式单例模式 (4) 双检查锁机制单例(推荐)


补充说明

参照博客:https://blog.csdn.net/cselmu9/article/details/51366946


分享到:
评论

相关推荐

    设计模式_创建型_单例模式.md

    设计模式_创建型_单例模式

    java 23种设计模式.zip

    1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、...

    JAVA-设计模式-创建型模式-单例模式

    JAVA-设计模式-创建型模式-单例模式

    单例设计模式.pdf

    单例模式(Singleton Pattern)是 Java 中最常见的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    创建型模式之单例模式(Singleton Pattern)

    4、单例模式(Singleton Pattern) 用意:仅允许生成一个对象时

    设计模式_单例模式.zip

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo

    Java单例模式应用研究.pdf

    单例模式是一种最简单的创建型设计模式,主要用于对系统资源的管理与控制,在软件开发中大量使用,如Windows的文件系统、回收站、打印机等。文中通过内容管理系统项目,深入剖析了几种常用的单例类,包括饿汉式单例类、...

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题...12. (单选题)下面不属于创建型模式的有( 正确答案: C )。 A.抽象工厂模式( Abstract Factory ) B.工厂方法模式(Factory Method) C.适配器模式(Adapter) D.单例模式(Singleton)

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    1. 创建型模式:创建型模式关注对象的创建过程,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式。这些模式可以帮助我们更灵活地创建对象,避免直接使用new关键字来创建对象,降低...

    创建型 结构型 设计型设计模式相关知识

    1、 创建型设计模式 创建型设计模式主要“关注对象的创建”。 1. 单例模式 单例模式:能不用就不用 ,他的目的就是为了让一个类只创建一个实例。 用法:把对象的创建权限关闭,提供一个人公开的静态方法,实现静态...

    单例模式 Singleton Pattern

    这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问...

    用Java实现23种设计模式

    1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2. 结构型模式 适配器...

    Java单例模式设计

    代码中演示了Java设计模式中的单例模式,其中包括饿汉单例模式,懒汉单例模式以及序列化饭序列化单例模式。在实际的开发中,可以直接借鉴使用。

    java版本的设计模式的实现demo

    单例模式是最常见的创建型模式之一,它确保一个类只有一个实例,并提供全局访问点。在Java中,可以通过私有构造函数、静态私有变量和公共静态方法来实现单例模式。 3. 工厂模式 工厂模式是另一种常用的创建型模式,它将...

    c++设计模式-单例模式

    c++设计模式-创建型模式-单例模式源码,懒汉式 饿汉式源码,qt工程,单例模式线程安全问题,单例模式实现方式

    软件设计模式-2021秋-实验1-创建型模式实验报告附源码和类图.zip

    软件设计模式-2021秋-实验1-创建型模式实验报告附源码和类图.zip 工厂方法模式、建造者模式、抽象工厂模式、单例模式

    【设计模式】(四)–创建型模式–单例模式

    【设计模式】(四)–创建型模式–单例模式单例模式的定义饿汉式单例模式懒汉式单例模式饿汉式与懒汉式的区别:单例模式的优点单例模式的缺点Java中其他生成单例的方式使用Spring框架,Spring框架默认就是单例双重...

    Singleton(单例模式)

    在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    单例模式有多种实现方式,其中比较常见的有饿汉式、懒汉式、双重检查锁定等。 工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和使用分离,使得代码更具有可维护性和可扩展性。该模式通常会定义一个...

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    单例模式是保证一个类仅有一个实例,并自行提供访问该实例全局访问点的创建型模式。 原型模式用来解决对象的创建问题,它是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的对象 ...

Global site tag (gtag.js) - Google Analytics