设计模式:单例(singleton)

单例应该是应用最广泛的设计模式之一了,它用于确保在整个系统中只存在一个指定类的实例,共享其数据及操作。

  • 基本用法:(Java)
public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();
    
    public static SingletonClass getInstance()
    {
        return instance;
    }
}
  •  建议给这个单例类加上final修饰(C#则是sealed),以免被不当继承。
  •  上面的代码仅仅是最基本的(线程安全),其中没有防止外部去不当地实例化。所以可以改为以下方式:

public final class SingletonClass {
    private static SingletonClass instance = new SingletonClass();
    
    public static SingletonClass getInstance()
    {
        return instance;
    }
    
    private SingletonClass(){}
}

  这里通过把默认构造函数可见性设为private,来避免外部调用。

  •  Lazy initialization方式
public final class SingletonClass {
    private static SingletonClass instance = null;

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

    private SingletonClass() {
    }
}

  这种方式的好处是,在未被调用时不需要创建实例;但在多线程开发时要考虑到线程安全(注意代码中的synchronized)。

 

相关问题:

  • 能否创建一个抽象类的单例?

    这个问题本身可以说是不恰当地使用了设计模式。从上面的例子可以看出,由于抽象类不能被实例化,当然也就不能声明这样一个静态实例了。(当然从代码层面上说,还是可以声明一个静态抽象类对象,但它无法被正确创建或确保不被替换)

转载于:https://www.cnblogs.com/angel271/p/6051309.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值