单例模式---个人认识!!

单例模式是23中设计模式中使用率比较高的一个,网上也有很多他的介绍.但是他们大多都说"Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易"  .而我通过项目的参与有了些心得:

1)内存上有切只有一个实例:学过尚学堂后有个毛病,总是爱从内存上剖析问题.我查看设计模式文档时上面说过: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在.就是说在在内存中,对于Singleton下的类,内存中永远不可能存在2份或2份以上的实例!!这个在Spring中也有验证”Singleton模式中所谓的对象范围是指在每一个ClassLoader指定class创建的实例有且仅有一个”.

2)不应有非常量的私有变量:我们知道了在内存中, Singleton模式的类有切只有一份.那就意味着你对给类的任何操作(方法的的使用,属性的操作等)其实都是对内存中那个唯一实例的操作!!因而可以说Singleton对于项目来说是具有全局性,唯一性的.这让我们想到了什么---静态的类.所以说对于静态类的要求就基本上适用于Singleton类.因而Singleton类不应该有非常量的私有变量(详细:不是说不能有,是不应有.由于只有这一份实例,因而对其的操作都会改变这唯一的实例,因而非常容易造成线程的不安全,即使静态的变量也不是安全的,因而如有变量最好是常量,当然也有访问量统计这让的全局性变量的需求,那这个变量最好是静态的,而且方法要具有排它性---synchronized).

3)在项目中他应该只负责功能问题,而非存储数据:这个比较好理解,对于Spring来说Dao是单例模式.他只是连接数据库并查阅信息来反馈给用户接受,这是由于Dao没有私有变量,且在内存有且仅有一份,因而无法使用Dao本身来存储反馈回来的值,而只能选择其他含有大量私有变量,且在内存中可以有大量实例存在的类接受---如下面所说的Pojo类!!Pojo类在内存中有很多实例,因为他不是单例模式,这使的他可以有很多的私有变量来在内存中存储类型一致却内容不同的数据!!因而由于单例模式的特性,他在项目的工作不应是存储数据,而是解决某种功能性的需求!!

4)模式单例与Spring单例区别:这个是我在看Spring文档时才发现的.“Singleton模式中所谓的对象范围是指在每一个ClassLoader指定class创建的实例有且仅有一个。把Spring的singleton作用域描述成一个container对应一个bean实例最为贴切”就是说模式的单例是真正的单例,他在内存上只有一个,你不能掰出第二个来.而Spring是在Spring管理中的bean是单例,在Spring管理之外你可以new出一个新的来,而且在内存上是不同的对象.这个拿Jsf的配置最能体现.Jsf也是单例模式不过他是更窄的单例.对话式的单例:当一个对话(session)练到服务器时,Jsf会自动的生成这个对话的对象实例.不过在这个对话里这个实例是唯一!因而对于另一个对话它也有唯一的实例.因而可以说实例有很多.但对于一个会话你只拥有其中的一个!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值