黑马程序员技术交流社区
标题:
单例设计模式应用
[打印本页]
作者:
赵学刚
时间:
2012-11-28 00:25
标题:
单例设计模式应用
本帖最后由 赵学刚 于 2012-12-3 11:23 编辑
刚看了单例设计模式,感觉应用在实际程序中还比较陌生,谁能举个例子说说是怎么应用单例模式解决实际需求的呢,比如配置文件参数修改,最好附上代码,谢谢。。。。。。。。。。。。。。
作者:
王阳
时间:
2012-11-28 01:35
不太理解你要做什么,这么说吧,你可以这样理解单例,好比说你是一家之主,你可以娶很多个老婆,但是他们只有你一个老公,你是独一无二的,(不过就是幻想下。{:soso_e113:}),这个就是单例模式了。
作者:
郑传庆
时间:
2012-11-28 09:29
王阳 发表于 2012-11-28 01:35
不太理解你要做什么,这么说吧,你可以这样理解单例,好比说你是一家之主,你可以娶很多个老婆,但是他们只有你 ...
你这个比喻不错哈;P,在把老公设成私有的,再给他的老婆们提供一个公共的联系方式
作者:
madianguo
时间:
2012-11-28 10:44
在Java 的单例模式中,有两种实现方式,懒汉式与饿汉式。
<strong> 单例模式实现之饿汉式</strong>
|-单例类Songleton /**
* 单例模式实现之一饿汉式
*
* 一开始就创建Singleton的对象并实例化
*
*/
class Singleton
{
// 创建一个Signleton实例对象,用来存储创建好的实例
private static Singleton singleton = new Singleton();
// 将构造方法进行私有化
private Singleton()
{
// 待执行代码
}
// 获取Sington实例对象
public static Singleton getInstance()
{
// 返回实例对象
return singleton;
}
}复制代码|-测试类 public class SingletonDemo
{
public static void main(String[] args)
{
// 创建Singleton实例对象
Singleton singleton01 = Singleton.getInstance();
Singleton singleton02 = Singleton.getInstance();
// 判断两个实例对象是否是同一个
if (singleton01 == singleton02)
{
//相同打印"The Same Object!"
System.out.println("The Same Object!");
}
else
{
//不相同打印"The DifferentObject!"
System.out.println("The Different Object!");
}
}
<strong>单例模式实现之懒汉式
</strong>|-单例类Songleton /**
* 单例模式实现之一懒汉式
*
* 当需要实例对象的时候再去生成对象进行实例化
*
*/
class Singleton
{
// 声明一个Signleton变量,用来存储创建好的实例
private static Singleton singleton = null;
// 将构造方法进行私有化
private Singleton()
{
// 待执行代码
}
// 获取Sington实例对象
public static Singleton getInstance()
{
// 判断singleton 是否为null,是的话实例化
if (null == singleton)
{
singleton = new Singleton();
}
// 返回实例对象
return singleton;
}
}
复制代码
单例模式有以下三个特点:
一、单例类在整个系统中只能有一个实例
二、单例类必须自己创建自己的实例
三、单例类必须系统中其他对象提供这个实例
单例模式的好处就是:类只实例化一次,省资源,节省开销,提高速度
单例设计模式 就是当一个类只有实例时使用。
例子:每台计算机可以有若干个打印机,但只能有一个打印服务,避免两个打印作业同时输出到打印机
作者:
黑马-王宁
时间:
2012-11-28 12:47
单例模式是创建模式中普遍采用的一种。使用单例模式可以确保某个类只会有一个实例被创建。单例模式是通过下面的思想来保证的:不让类以外的任何事物创建对象的实例。通常来讲,单例可以缩减内存的需求。实现方式也有很多种。
假如你知道将要创建的实例是一个子类,那么将父类声明为抽象类并提供一个方法来获得当前的实例。在AWT包中,Toolkit类就是一个典型的代表。Toolkit的构造器是public的。
public Toolkit()
并且类具有一个方法getDefaultToolkit()用于获得特定的子类。在这里,子类是和平台相关的。
public static Toolkit getDefaultToolkit()
在linux平台上,特定的子类是sun.awt.X11.XToolkit。然而,你并不需要知道这些细节,因为访问的时候我们是通过子类的抽象父类Toolkit实现的。
Collator类是单例模式中另一个例子,只是实现略有不同。它提供了两个getInstance()方法。无参数的版本得到默认locale的Collator。也可以通过传递一个参数来获得指定locale的Collator。通过同样的locale参数多次获得的Collator实例是相同的。Collator的构造器是PRotected类型的。在J2SE标准类库中,我们还可以找到很多这样的例子。
我们可能会认为限制一个类的构造器的访问会自动将这个类设计为单例模式的,但是并非如此。Calendar就是这样一个例子,Calendar的构造器是protected的,提供了一个getInstance()方法来获得这个类的实例,每次调用getInstance()都会创建一个新的实例。因此它不是单例模式的。
当创建自己的单例类的时候,确保只有一个实例被创建:
public class MySingleton {
private static final MySingleton INSTANCE =
new MySingleton();
private MySingleton() {
}
public static final MySingleton getInstance() {
return INSTANCE;
}
}
静态方法getInstance()返回这个类的一个实例。注重即使这个实例需要是子类,也无须修改API。
一般来说,不需要提供一个getInstance()方法,因为INSTANCE变量可以声明为public的。但是,getInstance()方法可以提供更好的灵活性,尤其是以后系统的设计发生变化的时候。出色的虚拟机实现可以将getInstance()方法进行内联。
编写一个好的单例模式的类并非这么简单,假如需要使得自己的单例类是可序列化的,那么必须提供一个readResolve()方法:
/**
* Ensure Singleton class
*/
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
提供readResolve()方法后,反序列化的时候将只有一个对象产生,无论调用了多少次getInstance()方法。假如不提供readResolve()方法,当反序列化的时候,每次都会创建一个新的对象实例。
假如只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息的时候,单例模式是非常有用的。在设计的时候就标记好单例模式的需求可以简化开发。然而,有些时候我们意识不到需要使用单例模式直到系统出现了性能问题,
这个时候我们就需要重构代码/例如,你可能发现系统的性能在下滑,原因是程序中重复的创建了同一个类的很多对象,通过应用单例模式则可以很好的避免创建通常的对象。这可以减少系统用来创建对象的时间,也可以节省垃圾收集器用来释放这些实例的时间。
总的来说,假如不想创建一个类的多个实例的时候就使用单例模式。假如构造器中不需要其他的操作,那么就提供一个空的私有构造器,假如需要子类的话就提供一个protected类型的。否则,默认情况下,系统会提供一个公共的构造器。
需要注重的是在一个给定的类装载器中单例模式保证是唯一的。假如在多个不同的企业容器中使用通常的类的时候,那么需要为每个容器提供一个实例。
作者:
王阳
时间:
2012-11-28 19:34
王阳 发表于 2012-11-28 01:35
不太理解你要做什么,这么说吧,你可以这样理解单例,好比说你是一家之主,你可以娶很多个老婆,但是他们只有你 ...
精辟都不给个技术分。:(
作者:
赵学刚
时间:
2012-11-28 19:45
看了好多,都很不错,帮助很大,谢谢各位
作者:
何伟
时间:
2012-11-30 13:55
王阳 发表于 2012-11-28 01:35
不太理解你要做什么,这么说吧,你可以这样理解单例,好比说你是一家之主,你可以娶很多个老婆,但是他们只有你 ...
:lol:lol:lol:lol
作者:
赵学刚
时间:
2012-12-3 00:15
问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2