静态类和单例模式区别

观点一:(单例)
单例模式比静态方法有不少优点:
首先,单例能够继承类,实现接口,而静态类不能(能够集成类,但不能集成实例成员);
其次,单例能够被延迟初始化,静态类通常在第一次加载是初始化;
再次,单例类能够被集成,他的方法能够被覆写;
最后,或许最重要的是,单例类能够被用于多态而无需强迫用户只假定惟一的实例。举个例子,你可能在开始时只写一个配置,可是之后你可能须要支持超过一个配置集,或者可能须要容许用户从外部从外部文件中加载一个配置对象,或者编写本身的。你的代码不须要关注全局的状态,所以你的代码会更加灵活。

观点二:(静态方法)静态方法中产生的对象,会随着静态方法执行完毕而释放掉,并且执行类中的静态方法时,不会实例化静态方法所在的类。若是是用singleton,   产生的那一个惟一的实例,会一直在内存中,不会被GC清除的(缘由是静态的属性变量不会被GC清除),除非整个JVM退出了。这个问题我以前也想几天,而且本身写代码来作了个实验。

观点三:(Good!)html

因为DAO的初始化,会比较占系统资源的,若是用静态方法来取,会不断地初始化和释放,因此我我的认为若是不存在比较复杂的事务管理,用singleton会比较好。我的意见,欢迎各位高手指正。  web

http://blog.csdn.net/v1v1wang/article/details/5511756数据库

-----------------------------------------------------------------------------------------------------------浏览器

 

这里暂且把单例模式限定为不是全用静态函数实现的。安全

1。使用的方便性:若是须要初始化工做,单例模式能够在构造函数里面完成,全静态函数的类须要一个额外的函数来完成初始化工做,并且使用者若是没有调用这个initialize函数,那么后续的操做就会有问题,构造函数会被默认调用,因此使用起来比较简单,对使用者作出了最少的假设。服务器

2。初始化时机:单例模式初始化比较灵活,能够在须要的时候初始化,而全静态函数必然致使成员全为静态成员,静态成员是在编译时就初始化好了。若是初始化成本比较昂贵,而且程序里面未必必定使用这个类,那这将是单例模式的一个很大优点。顺便说一下全局变量,全局变量的初始化顺序是未指定的。函数

例如 全局变量int a; int b;编译器是先初始化a仍是先初始化b?我想你们只能靠猜,或者在某个编译器上实验一下给出答案,一旦要是有个新编译器,结果又会是什么样子呢?post

3。最重要的区别:单例模式能够有多态,而全静态的类不能支持多态。学习

http://www.cnblogs.com/phoebus0501/archive/2011/03/12/1982408.html优化

 

数据库操做类不宜使用singleton模式

不要将数据库链接作成单例,由于一个系统可能会与数据库有多个链接,而且在有链接池的状况下,应当尽量及时释放链接。Singleton模式因为使用静态成员存储类实例,因此可能会形成资源没法及时释放,带来问题。

 

作项目作的多了,因此考虑问题的方向也不同了。之前刚开始只是以实现功能为目的,美观、实现方式、代码逻辑、执行效率等等,几乎不考虑。
然而要想成为合格的软件设计师,软件的设计就必须全面周到,不只仅只是考虑如何开发,更多的要考虑软件的发展和维护。
因此平时的学习中多思考多理解是很是重要的。
在学习DRP中,咱们都知道王勇把业务逻辑层(Manager、servlet)都几乎作成的单例模式。我当时就思考为什么他要这么作呢?
渐渐的我明白了,并且是切身的理解了。
在用.net开发web项目的时,在UI层咱们要实例化BLL层的类,然而正由于是web开发,若是按照咱原来的写法(以下)
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
            News news = new NewsManager().SelectById(newsid); //News:新闻实体类,为Model层。 NewsManager:BLL层的类
    }
}
那么客户端只要与服务器须要交互一次就要执行一次Page_Load事件【由于与服务器交互后客户端浏览器会刷新页面】,那么就要实例化一次NewsManager(),这还仅仅是Page_Load的事件,每每还会有别的事件,好比按钮单击事件,由于UI层与BLL层的交互是很是平凡的。
试想下这么屡次重复的New的次数,是多么的浪费资源啊,即使把NewsManager设置成该页面的全局变量,仍是免不了每刷新一次就实例化一次的弊端。
 
因此 把BLL层的类作成单例模式是出于对服务器资源优化的一个应用
关于单例模式的应用,我目前了解到的有:配置文件、打开窗口、工厂模式的工厂类、再有就是今天说的BLL层管理类。
若是各位还有对于单例模式应用和技巧的看法还请多多请教
 
 
BO层为何设计为单例模式?
一、首先要理解每个BO实例是用来处理用户的一类请求操做的,即然是用来处理一类操做,那么全部的操做均可以用一个实例来完成即单例,只要不存在实例变量,那么就不会发生线程安全的问题。此时若是设计为多例的,而且不存在实例变量的状况,那么新实例和旧实例是没有任何区别的,都是执行同一类操做,处理用户的同一类请求。那么这时多实例只会占用更多的内存空间,没有任何益处。
 
二、理解线程栈的问题。对于用户的每一次请求操做,都有一个线程来负责该用户的请求处理,那么这个线程在处理用户业务的同时,会在内存中分配一段内存区域,该内存区域存放了用户所调用的方法中的变量,咱们称该内存区域为线程栈,线程栈中除了存有方法中的局部变量外,还持有调用该方法的单实例对象的一个引用。由于每个线程栈都存储了当前单实例对象对应方法中局部变量的不一样版本,那么这样每个线程的方法操做都不会影响其余线程的方法操做,因此不存在线程安全的问题了。
 
总结:业务层是用来处理用户的业务逻辑操做的,概念上讲业务层的对像应该设计为只存在操做方法,而不该该有实例变量的状况会更加符合业务层处理业务操做的概念。单例强呀!
相关文章
相关标签/搜索