`

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


分享到:
评论

相关推荐

    5. 创建型设计模式小结1

    1. 单例模式:单例模式确保一个类只有一个实例,并提供一个全局访问点。它在多线程环境中尤为重要,因为需要保证线程安全的单个实例创建。在Java等语言中,通常使用双检锁(Double-Check Locking)或者静态内部类的...

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

    单例模式是软件设计模式中的一种,属于创建型模式。单例模式的目的是确保一个类在任何时候都只有一个实例,并且提供一个全局访问点给外部程序使用。 ## 单例模式的定义 单例模式是一种常用的软件设计模式,通过单例...

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    设计模式之单例模式(结合工厂模式)

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是提供一个接口来让客户端请求特定类型的实例。这样,客户端无需知道具体的产品实现...

    java 23种设计模式.zip

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

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

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

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

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...

    java设计模式-单例.pdf

    单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景中都是非常有用的,比如日志对象、配置管理器、线程池等。 ...

    [创建型模式] 单例模式的理解

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象需要共享资源时非常适用,比如线程池、数据库连接...

    单例设计模式.pdf

    单例设计模式是一种在软件设计中广泛使用的设计模式,它属于创建型模式,其核心目标是确保类只有一个实例,并提供一个全局访问点。这个模式在Java中尤其常见,因为Java的垃圾回收机制允许对象长时间驻留在内存中,...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。这使得系统可以在不指定具体类的情况下引用抽象。在Java中,工厂模式可以通过定义一个工厂接口和多个实现了该接口的具体...

    Java单例模式应用研究.pdf

    单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局访问。这种模式在实际软件开发中有着极其广泛的应用...

    Java 单例模式 工具类

    本篇文章将深入探讨如何在Java中实现单例模式,以及如何创建一个工具类来封装单例的创建。 首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了...

    单例模式.doc

    单例模式是一种常用的创建型设计模式,它的主要目的是确保某个类只有一个实例,并且提供一个全局访问点来获取该实例。这种模式适用于系统中只需要一个实例的情况,例如日志记录器、配置管理等。 #### 三、单例模式...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    设计模式之创建型模式实验.docx

    【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...

    设计模式——策略模式 & 单例模式

    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这样做的好处在于,当系统只需要一个共享资源时,可以避免多次实例化导致的资源浪费,同时方便对这个唯一实例进行控制和管理。 ...

    php单例模式和工厂模式

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,不会直接实例化对象,而是通过一个专门的工厂类来创建。工厂类可以根据提供的参数来决定创建哪种类型的实例。 在 ...

    三种工厂设计模式和两种单例模式

    1. **简单工厂模式**:这是一种创建型设计模式,它提供了一个静态方法来创建对象,而无需暴露实例化逻辑。简单工厂模式适用于对象创建相对固定且不需经常修改的情况。工厂类负责创建对象,客户端通过调用工厂的静态...

Global site tag (gtag.js) - Google Analytics