单例模式(Singleton)

一、概念:确保生成一个实例的模式被称为单例模式。

1.Singleton类定义了static字段 singleton并将其初始化为Singleton的实例。 

2.Singleton类的构造函数是private ,这是为了禁止从外部调用构造函数,new Singleton()。

 

二、单例模式中的角色:

Singleton

Singleton角色中有一个返回唯一实例的static方法。该方法总是会返回同一个实例。

三、单例模式的优缺点

优点: 

1.提供了对唯一实例的受控访问。 

2.由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。 

3.允许可变数目的实例。 

4.避免对共享资源的多重占用。 


缺点: 
       1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。 

2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。 

3.单例类的职责过重,在一定程度上违背了“单一职责原则”。 

4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。 
 

使用注意事项: 

1.使用时不能用反射模式创建单例,否则会实例化一个新的对象 

2.使用懒单例模式时注意线程安全问题 

3.饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式) 

四、单例模式的现实使用场景


        1. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 

 2.数据库连接池的实现,也包括线程池。为什么要做池化,是因为新建连接很耗时,如果每次新任务来了,都新建连接,那对性能的影响实在太大。所以一般的做法是在一个应用内维护一个连接池,这样当任务进来时,如果有空闲连接,可以直接拿来用,省去了初始化的开销。所以用单例模式,正好可以实现一个应用内只有一个线程池的存在,所有需要连接的任务,都要从这个连接池来获取连接。如果不使用单例,那么应用内就会出现多个连接池,那也就没什么意义了。如果你使用 Spring 的话,并集成了例如 druid 或者 c3p0 ,这些成熟开源的数据库连接池,一般也都是默认以单例模式实现的。

3.spring注入的bean一般是单例的

 

五、生成单例的2中方法

方法一

public class TicketMaker {
    //私有构造方法
    private TicketMaker(){ }
    
    //静态TicketMaker字段
    public static TicketMaker ticketMaker = new TicketMaker();

    private int ticket = 1000;

    public static TicketMaker getInstance(){
        return ticketMaker;
    }

    public synchronized int getNextTicketNumber(){
        return ticket++;
    }

}

方法二

public class Singleton {
    
    private static  Singleton singleton = null;
    private Singleton(){
        slowdown();
    }

    //这里加了锁,不加的话多线程情况下可能会产生多个实例
    public static synchronized Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }

    //线程睡眠1秒
    private void slowdown(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值