首页 > 试题广场 >

单例模式中,两个基本要点()和单子类自己提供单例

[不定项选择题]
单例模式中,两个基本要点是
  • 构造函数私有
  • 静态工厂方法
  • 以上都不对
  • 唯一实例

设计模式-单例模式

知识点

什么是单例模式?

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

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式有分为饿汉式懒汉式

特点:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

应用实例:

  • 1、一个班级只有一个班主任。
  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

  • 1、要求生产唯一序列号。
  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

实例

单例模式-饿汉式

代码

//单例模式-饿汉式
public class SingletonDemo {
    public static void main(String[] args) {
        //编译错误:无法实例化
        // Singleton singleton = new Singleton();

        //正确获取对象的方法
        Singleton singleton = Singleton.getINSTANCE();
        singleton.hello();
    }
}

class Singleton{
    //创建一个本身对象
    private static final Singleton INSTANCE = new Singleton();

    //让构造方法为private,这样该类就不会被实例化
    private Singleton(){}

    //创建一个获取对象的方法
    public static Singleton getINSTANCE() {
        return INSTANCE;
    }

    public void hello(){
        System.out.println("Hello World! ——单例模式-饿汉式");
    }
}

结果

Hello World! ——单例模式-饿汉式

单例模式-懒汉式(线程不安全版)

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

代码

//单例模式-懒汉式
public class SingletonDemo2 {
    public static void main(String[] args) {
        Singleton2 singleton = Singleton2.getInstance();
        singleton.hello();

    }

}

class Singleton2{
    private static Singleton2 instance;
    private Singleton2(){}

    public static Singleton2 getInstance() {
        if (instance == null){
            instance = new Singleton2();
        }
        return instance;
    }

    public void hello(){
        System.out.println("Hello World! ——单例模式-懒汉式");
    }
}

结果

Hello World! ——单例模式-懒汉式

单例模式-懒汉式(线程安全版)

描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。

代码

//单例模式-懒汉式
public class SingletonDemo3 {
    public static void main(String[] args) {
        Singleton3 singleton = Singleton3.getInstance();
        singleton.hello();

    }

}

class Singleton3{
    private static Singleton3 instance;
    private Singleton3(){}

    public synchronized static Singleton3 getInstance() {
        if (instance == null){
            instance = new Singleton3();
        }
        return instance;
    }

    public void hello(){
        System.out.println("Hello World! ——单例模式-懒汉式");
    }
}

结果

Hello World! ——单例模式-懒汉式
发表于 2020-02-09 11:25:32 回复(23)
通常单例模式在Java语言中,有两种构造方式:
1.懒汉方式。指全局的单例实例在第一次被使用时构建。

//懒汉式
public class Singleton2 {
private static Singleton2 INSTANCE=null;

private Singleton2(){}

public static Singleton2 getInstance(){
if(INSTANCE!=null){
INSTANCE = new Singleton2();
}
return INSTANCE;
}
}
2.饿汉方式。指全局的单例实例在类装载时构建。

//饿汉式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();

private Singleton(){}

public static Singleton getInstance(){
return INSTANCE;
}
}
编辑于 2017-09-26 09:57:29 回复(13)
a,d 构造方法私有不允许直接继承与直接new只能通过单例模式有的getInstance方法获取实例,并确保该实例在内存中的唯一性
发表于 2017-04-27 08:19:44 回复(0)
单例模式  ===>懒汉模式和饿汉模式
懒汉模式在调用方法时创建对象,饿汉模式在类初始化时创建对象
特点:构造方法私有  单一实例
发表于 2018-09-24 11:27:49 回复(0)
双重校验锁实现懒汉单例模式
public class Singleton{
    private volatile static Singleton instance;
    //私有构造函数
    private Singleton{
        
    }
    //唯一实例
    public static Singleton getInstacne(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

发表于 2019-09-12 09:27:14 回复(1)
额,这题,不是让写两个要点嘛,给了其中一个了
发表于 2017-07-16 16:17:38 回复(2)
ifg头像 ifg
// 饿汉式,利用同一时间只能有一个线程对类进行初始化来保证线程安全
public class Clazz {
    private Clazz() {}
    private static Clazz instance = new Clazz();
    public static Clazz getInstance() {
        return instance;
    }
}

// 懒汉式1,内部类方式。同样利用同一时间只能有一个线程对类进行初始化来保证线程安全
public class Clazz {
    private Clazz() {}
    private static class InnerClazz() {
        public static Clazz instance = new Clazz();
    }
    public static Clazz getInstance() {
        return InnerClazz.instance;
    }
}

// 懒汉式2,双重检测方式。可能会有多个线程同时进入第一个判断,之后多个线程依次进入同步代码块,第一个线程完成初始化,其他线程直接退出
// 
public class Clazz {
    private Clazz() {}
    private static Clazz instance;
    public static Clazz getInstance() {
        if(instance == null) {
            synchronized (Clazz.class) {
                if(instance == null) {
                    instance = new Clazz();
                }
            }
        }
        return instance;
    }
}

发表于 2019-10-30 16:30:20 回复(0)
这道题不是单选么
发表于 2018-04-14 15:30:26 回复(1)
语文没学好。。。

发表于 2017-10-04 09:30:35 回复(1)
单例模式  ===>懒汉模式和饿汉模式 懒汉模式在调用方法时创建对象,饿汉模式在类初始化时创建对象 特点:构造方法私有  单一实例
发表于 2021-11-09 14:12:29 回复(0)
单例模式中两个基本要点是唯一实例  构造函数私有
发表于 2019-08-21 10:43:06 回复(1)
我来对静态工厂方法来补充学习
静态工厂方法(Static Factory Method)是一种创建对象的设计模式,它是一种特殊的静态方法,用于创建和返回类的实例。在静态工厂方法模式中,不直接使用构造函数创建对象,而是使用静态工厂方法来封装对象的创建逻辑。
静态工厂方法具有以下特点:
1. 名称可自定义:与构造函数不同,静态工厂方法可以使用任意名称。通常情况下,静态工厂方法的名称会体现创建对象的意图或特性。
2. 不需要每次调用都创建新对象:静态工厂方法可以在内部控制对象的创建过程,并决定是否返回缓存的实例,或者重用已有实例。这样可以减少创建对象的开销。
3. 可以返回子类类型的对象:静态工厂方法可以返回类的任意子类类型的对象,这在使用面向接口编程的场景中非常有用。
4. 可以简化 API 接口:通过静态工厂方法可以将多个构造函数进行归并,从而简化 API 的使用。

静态工厂方法模式在Java中广泛应用,例如在标准类库中的`java.util.Collections`类和`java.util.Arrays`类中都使用了静态工厂方法来创建对象。
下面是一个简单的示例,展示了如何使用静态工厂方法创建对象:

```java
public class MyObject {
    private String name;

    private MyObject(String name) {
        this.name = name;
    }

    public static MyObject createInstance(String name) {
        return new MyObject(name);
}
```
在上述示例中,`createInstance()`是一个静态工厂方法,用于创建`MyObject`类的实例。通过静态工厂方法,我们可以在内部控制对象的创建过程,并返回新创建的实例。这样,使用者在创建对象时只需要调用静态工厂方法,而不需要直接调用构造函数。

发表于 2023-06-12 21:03:55 回复(0)
设计模式-单例模式 知识点 什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 单例模式有分为饿汉式和懒汉式 特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 应用实例: 1、一个班级只有一个班主任。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例)。 2、避免对资源的多重占用(比如写文件操作)。 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。 实例 单例模式-饿汉式 代码 //单例模式-饿汉式 public class SingletonDemo { public static void main(String[] args) { //编译错误:无法实例化 // Singleton singleton = new Singleton(); //正确获取对象的方法 Singleton singleton = Singleton.getINSTANCE(); singleton.hello(); } } class Singleton{ //创建一个本身对象 private static final Singleton INSTANCE = new Singleton(); //让构造方法为private,这样该类就不会被实例化 private Singleton(){} //创建一个获取对象的方法 public static Singleton getINSTANCE() { return INSTANCE; } public void hello(){ System.out.println("Hello World! ——单例模式-饿汉式"); } } 结果 Hello World! ——单例模式-饿汉式 单例模式-懒汉式(线程不安全版) 这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。 代码 //单例模式-懒汉式 public class SingletonDemo2 { public static void main(String[] args) { Singleton2 singleton = Singleton2.getInstance(); singleton.hello(); } } class Singleton2{ private static Singleton2 instance; private Singleton2(){} public static Singleton2 getInstance() { if (instance == null){ instance = new Singleton2(); } return instance; } public void hello(){ System.out.println("Hello World! ——单例模式-懒汉式"); } } 结果 Hello World! ——单例模式-懒汉式 单例模式-懒汉式(线程安全版) 描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。 优点:第一次调用才初始化,避免内存浪费。 缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。 getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。 代码 //单例模式-懒汉式 public class SingletonDemo3 { public static void main(String[] args) { Singleton3 singleton = Singleton3.getInstance(); singleton.hello(); } } class Singleton3{ private static Singleton3 instance; private Singleton3(){} public synchronized static Singleton3 getInstance() { if (instance == null){ instance = new Singleton3(); } return instance; } public void hello(){ System.out.println("Hello World! ——单例模式-懒汉式"); } } 结果 Hello World! ——单例模式-懒汉式
发表于 2022-10-24 13:48:20 回复(0)
枚举也可以实现单列模式,构造函数私有?
发表于 2020-08-26 23:12:34 回复(0)
单例模式,懒汉是和饿汉式 懒汉是方法调用的时候才调用 恶汉是初始化的时候调用 特点构造函数私有,单一实力
编辑于 2024-02-15 22:51:59 回复(0)
说实话,这个题,b选项为什么不对呢?我不理解。如果它不是静态的,那么就需要我们创建对象然后通过对象调用的方式进行,那这个时候构造函数又是私有的,又没法调用创建对象,这不是矛盾了吗?
发表于 2022-08-17 19:08:53 回复(0)
构造函数私有,单一实例
发表于 2022-05-13 11:01:49 回复(0)
静态工厂方法为啥不对呢?
发表于 2022-03-16 01:55:23 回复(0)
静态工厂方法为什么不对?
发表于 2022-02-27 15:02:17 回复(0)
构造方能不允许直接继承并且只能通过调用getinstence获取对象u且保证该对象在内存中具有唯一性
发表于 2021-10-13 08:24:42 回复(0)