java基础之单例模式
来源:互联网 发布:dota2 饰品 c5 淘宝 编辑:程序博客网 时间:2024/05/22 10:50
为什么需要单例模式:
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,
比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,
这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,
即在整个的打印过程中我只有一个打印程序的实例。
简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。
Singleton 类(懒汉式)
namespace Singleton
{
public class Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
/// <summary>
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
/// </summary>
private Singleton()
{
}
/// <summary>
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
if (singleton == null)
{
singleton = new Singleton();
}
return singleton;
}
}
}
测试类代码:
class SingletonTest
{
public static void Main(string[] args)
{
Singleton.Singleton singletonOne = Singleton.Singleton.GetInstance();
Singleton.Singleton singletonTwo = Singleton.Singleton.GetInstance();
if (singletonOne.Equals(singletonTwo))
{
Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一个实例");
}
else
{
Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同一个实例");
}
Console.ReadKey();
}
}
从上面的结果可以看出来,尽管我两次访问了 GetInstance(),但是我访问的只是同一个实例,
换句话来说,上面的代码中,由于构造函数被设置为 private 了,
所以您无法再在 Singleton 类的外部使用 new 来实例化一个实例,您只能通过访问 GetInstance()来访问 Singleton 类,
GetInstance()通过如下方式保证该 Singleton 只存在一个实例:
首先这个 Singleton 类会在在第一次调用 GetInstance()时创建一个实例,并将这个实例的引用封装在自身类中,
然后以后调用 GetInstance()时就会判断这个 Singleton 是否存在一个实例了,如果存在,则不会再创建实例。
而是调用以前生成的类的实例,这样下来,整个应用程序中便就只存在一个实例了。
从这里再来总结单例模式的特点:
首先,单例模式使类在程序生命周期的任何时刻都只有一个实例,
然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,
必须通过 GetInstance()来请求(注意是请求)得到这个单例类的实例。
- Java基础之单例模式
- java基础之单例模式
- java基础之单例模式
- java基础之单例模式
- java基础之设计模式之单例模式
- java基础之----设计模式单例设计模式
- java基础之设计模式(1)--单例模式
- JAVA中的基础---设计模式之单例模式
- Java基础----单例模式
- java基础---单例模式
- 黑马程序员-Java基础-多线程之单例模式总结
- Java基础菜鸟之单例设计模式
- 黑马程序员-------Java基础之单例设计模式
- Java基础复习之三:单例模式
- 黑马程序员-JAVA基础之单例设计模式
- 黑马程序员----java基础之单例设计模式
- Java基础学习记录之单例模式(singleton)
- Java基础-设计模式-单例模式
- 项目中将Collection转换为一个数组注意Object[] 是不能被强转为String[]
- Android调用WebService(天气预报)
- 建立一个别人不能碰触的无敌文件夹
- 注册ActiveX控件的方法
- 我的listview 图片 内存溢出 解决方案
- java基础之单例模式
- myeclipse 中使用 jetty
- NSNumber 数字对象
- ASCII码表完整版
- C++学习第11篇-类的深入
- c 语言中的复杂声明
- Linux下rpm 安装包方式安装
- Android培训班(94)内核解压过程7
- Android平台的事件处理机制和手指滑动例子