设计模式-创建模式之单例模式

单例模式:最简单的一种设计模式

单例模式,确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例

java中有两种单例模式:饿汉式(加载时候就会实例化) 懒汉式(第一次引用时候才进行实例化)

饿汉式:

在类被加载时候 ,静态变量singLeton会被初始化,调用私有的构造器创建唯一的singLeton实例,提供一个私有的构造方法,以及提供一个公共的返回实例的引用

public class SingLeton {

    public int count = 0;
    static SingLeton singLeton = new SingLeton();
    private SingLeton() {
        
    }
    public static SingLeton getInsance() {
        return singLeton;
    }
}

饿汉式: 返回实例的方法需要同步synchroized 否则 多线程状态下  会出现多个实例

public class SingLetonLh {

    private SingLetonLh() {
    }
    private static SingLetonLh singLeton = null;
    public static synchronized SingLetonLh getInternec() {
        if(singLeton == null) {
            singLeton = new SingLetonLh();
        }
        return singLeton;
    }
}

饿汉式与懒汉式的区别

1、饿汉式单例实例 被加载时候就会创建,懒汉式则是第一次调用的时候才会初始化

2、从资源利用效率上说  懒汉式要差一些,但是从反应速度上和反应时间上讲,饿汉式要比懒汉式稍好些

3、饿汉式 更符合java语言特点

多线程的优化:如果使用synchronized  加在懒汉式的方法上,如果频繁的调用 会很耗费资源,可以加在方法内 ,判断为单利对象为空后加一个锁,锁方法内再一次判断是否为空   这样就节约了资源提高了效率

单例模式的应用:

单例模式的优点:减少内存开支,特别是对一个对象需要频繁的创建,销毁,减少了性能开销,当一个对象的产生需要比较多资源,如读取配置文件信息等 可以在启用时  直接产生一个对象,然后永久驻留内存的方式来解决

单例模式的缺点:无法创建子类,对测试不利,与单一职责原则冲突

单例模式的使用场景:

    一个系统中如果要求一个类有且仅有一个实例,当出现多个实例的时候就会哦造成不良反应的时候 就考虑使用单例模式

    要求生成唯一序列号的环境

    在整个项目中需要一个共享访问或者共享数据

    创建一个对象需要小号过多的资源 如访问io和数据库等资源

    需要定义大量的静态常亮,和静态方法的环境,可以采用单例模式

使用单例的注意事项:

当系统为多jvm分布式  或者一个jvm有多个类加载器  应避免使用有状态单例(当做状态库使用)

如果一个类实现了cloneAble  serializable接口  则有可能反序列化或克隆出一个新的实例类 因此单例不需要实现cloneAble  serializable接口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值