A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 凝霜的枯藤 于 2014-4-7 07:38 编辑

我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

6 个回复

正序浏览
本帖最后由 1453149997 于 2014-4-6 10:57 编辑

单例设计模式就是在程序运行过程中只需要使用某个类的一个对象,而产生多个对象势必会对程序的运行产生不利;
      如:在web开发中,每个表单需要一个唯一、不同的表单号,那么就需要一个能够产生唯一、不同表单号的类,这个类就是单例的,这样才能产生唯一、不同的表单号。
但是使用静态方法如何产生唯一、不同的表单号?!
回复 使用道具 举报
楼上已经说得很清楚了,我就说说你的最后一个问题吧!
1.先区分一下----单例模式与静态方法:
单例模式只是一种模式,强调某一个实例是唯一的。
静态方法是基于类的方法,与对象没有必然联系。
2.区分一下----单例类与静态类
单例类说得是对象的唯一性,就是采用单例模式的类,单例类强调用它构建的实例是唯一的。
静态类说得是类的唯一性,静态类中的所有的属性和方法都是静态的类,强调该类的所有属性和成员都是基于类的,而不是基于某一个对象的。
3.用单例模式还是静态方法呢,其实他们各有优缺点的,也许一个功能用他们都可以实现目的,但细节方面他们还是有不同的,用单例模式有许多优势,比如,单例可以继承类,实现接口,而静态类不能,再比如,单例可以被延迟初始化,静态类一般在第一次加载是初始化,再比如,单例类可以被集成,他的方法可以被覆写,最后,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活。
但是,用静态方法也有单例模式不具备的优势,静态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果是用singleton,   产生的那一个唯一的实例,会一直在内存中,除非整个JVM退出了。
回复 使用道具 举报
有些东西,比如说资源,配置文件。在系统中只需要一个对象来表示。单例模式的getinstance是静态方法啊。它需要把构造方法私有化,控制对象只有一个。
回复 使用道具 举报
单例模式比静态方法有很多优势:
首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;
再次,单例类可以被集成,他的方法可以被覆写;
最后,或许最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活
回复 使用道具 举报
如果是把一个connection对象封存在单例对象中,连接池里还有多个链接可以用,如果使用SingleTon,那在WEB访问时,就只能用一个数据库链接,那不是效果很差吗?
回复 使用道具 举报
比如调用连接数据库的时候

public class DBopen {
private Connection conn;
private static DBopen db;

private DBopen() {
  conn = this.getConnection();
}

public static DBopen open() {
  if (db == null) {
   db = new DBopen();
  }
  return db;
}

其他类在生成DBopen对象的时候
DBopen db = DBopen.open();
这样保证只连接一次
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马