静态类和单例模式区别

原文地址:http://www.cnblogs.com/zhtao_tony/p/3956047.html

观点一:(单例) 单例模式比静态方法有很多优势: 首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员); 其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化; 再次,单例类可以被集成,他的方法可以被覆写; 最后,或许最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活。
观点二:(静态方法)静态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果是用singleton,   产生的那一个唯一的实例,会一直在内存中,不会被GC清除的(原因是静态的属性变量不会被GC清除),除非整个JVM退出了。这个问题我之前也想几天,并且自己写代码来做了个实验。
观点三:(Good!)

由于DAO的初始化,会比较占系统资源的,如果用静态方法来取,会不断地初始化和释放,所以我个人认为如果不存在比较复杂的事务管理,用singleton会比较好。个人意见,欢迎各位高手指正。

http://blog.csdn.net/v1v1wang/article/details/5511756

-----------------------------------------------------------------------------------------------------------

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

1。使用的方便性:如果需要初始化工作,单例模式可以在构造函数里面完成,全静态函数的类需要一个额外的函数来完成初始化工作,而且使用者如果没有调用这个initialize函数,那么后续的操作就会有问题,构造函数会被默认调用,所以使用起来比较简单,对使用者做出了最少的假设。

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

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

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层为什么设计为单例模式?

1、首先要理解每一个BO实例是用来处理用户的一类请求操作的,即然是用来处理一类操作,那么所有的操作都可以用一个实例来完成即单例,只要不存在实例变量,那么就不会发生线程安全的问题。此时如果设计为多例的,并且不存在实例变量的情况,那么新实例和旧实例是没有任何区别的,都是执行同一类操作,处理用户的同一类请求。那么这时多实例只会占用更多的内存空间,没有任何益处。

2、理解线程栈的问题。对于用户的每一次请求操作,都有一个线程来负责该用户的请求处理,那么这个线程在处理用户业务的同时,会在内存中分配一段内存区域,该内存区域存放了用户所调用的方法中的变量,我们称该内存区域为线程栈,线程栈中除了存有方法中的局部变量外,还持有调用该方法的单实例对象的一个引用。因为每一个线程栈都存储了当前单实例对象对应方法中局部变量的不同版本,那么这样每一个线程的方法操作都不会影响其他线程的方法操作,所以不存在线程安全的问题了。

总结:业务层是用来处理用户的业务逻辑操作的,概念上讲业务层的对像应该设计为只存在操作方法,而不应该有实例变量的情况会更加符合业务层处理业务操作的概念。单例强呀!

时间: 2024-10-19 07:19:22

静态类和单例模式区别的相关文章

C#与Java在继承静态类上的区别

interface ITest { int Get(); } abstract class Test : ITest //此处会出现错误:Programe.Test不实现接口成员Program.ITest.Get(),即使是抽象类,实现部分也不可省略 { } Java Code: abstract class Test implements Runnable //此处不会报错,虽然Test没有实现Runnable接口,但是该类为抽象类 { } 可见C#继承接口后必须实现,但是java若为abst

java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在<Java中有关单例模式的面试问题>博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务.由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法

C# 静态类与非静态类、静态成员的区别

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似.两者的区别在于,私有构造器方式仍然可以从类的内部对

深入理解C# 静态类与非静态类、静态成员的区别

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似. 两者的区别:私有构造器方式仍然可以从类的内部对类

C#基础(七)——静态类与非静态类、静态成员的区别

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似.两者的区别在于,私有构造器方式仍然可以从类的内部对

单例模式和多例模式的区别(转)

原文链接:[设计模式] 多例模式与单例模式区别 多例模式与单例模式都禁止外界直接将之实例化,同时通过静态工厂方法向外界提供循环使用的自身的实例.它们的不同在于单例模式仅有一个实例,而多例模式则可以有多个实例. 多例模式往往具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的.一般而言,一个典型的多例类具有某种内部状态,这个内部状态可以用来区分各个实例,而对应于每一个内部状态,都只有一个实例存在. 原文链接:单例模式优缺点 主要优点: 1.提供了对唯一实例的受控访问. 2

C# 静态类与非静态类、静态成员的区别分析

静态类静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似. 两者的区别:私有构造器方式仍然可以从类的内部对类进

静态类与非静态类、静态成员的区别

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=521 静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0

设计模式-由浅到深的单例模式

前言:说起单例模式,可能大家都熟悉,可以说是设计模式中出现频率最高的一个,为了彻底弄清单例,在这里我将说明何为单例,单例模式的演变,已经和静态类之间的区别等. 1:概念 何为单例,就是在一个应用程序中只能有一个实例,就是保证对象只能被new一次. 2:懒汉模式 懒汉我觉得这个名字很形象,就是很懒,所以别的对象加载,它就不加载,你调用我的时候我在加载.比喻hibernate中也有懒模式.ok我们开始吧 2.1:非线程安全 一天小明去面试,面试官说,你给我写个单例模式,小明一想这实在太简单了不暇思索