<强>介绍强>
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例:
1,一个班级只有一个班主任。
2,窗户是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3,一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1,在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2,避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
1,要求生产唯一序列号。
2,网页中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3,创建的一个对象需要消耗的资源过多,比如I/O与数据库的连接等。
注意事项:getInstance()方法中需要使用同步锁同步(Singleton.class)防止多线程同时进入造成实例被多次实例化。
我们将创建一个SingleObject类.SingleObject类有它的私有构造函数和本身的一个静态实例。
SingleObject类提供了一个静态方法,供外界获取它的静态实例.SingletonPatternDemo,我们的演示类使用SingleObject类来获取SingleObject对象。
创建一个单例类。
<>以前public class  SingleObject { , ,,//创建,SingleObject 的一个对象 ,,private static  SingleObject instance =, new SingleObject (); , ,,//让构造函数为,私人的,这样该类就不会被实例化 ,,private SingleObject () {} , ,,//获取唯一可用的对象 ,,public static  SingleObject getInstance () { ,,,,,return 实例; ,,} , ,,public void  showMessage () { ,,,,,System.out.println (“Hello 世界!“); ,,} }从单例类获取唯一的对象。
<>以前public class  SingletonPatternDemo { ,,public static  void main (String [], args), { , ,,,,,//不合法的构造函数 ,,,,,//编译时错误:构造函数,SingleObject(),是不可见的 ,,,,,//SingleObject object =, new SingleObject (); , ,,,,,//获取唯一可用的对象 ,,,,,SingleObject object =, SingleObject.getInstance (); , ,,,,,//显示消息 ,,,,,object.showMessage (); ,,} }执行程序,输出结果:
<>以前Hello 世界! <强>单例模式的几种实现方式强>单例模式的实现有多种方式,如下所示:
是否懒惰的初始化:是
是否多线程安全:否
实现难度:易
描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁同步,所以严格意义上它并不算单例模式。
这种方式延迟加载很明显,不要求线程安全,在多线程不能正常工作。
实例 <>以前public class  Singleton {,, ,,,private static Singleton 实例;,, ,,,private Singleton () {},, ,, ,,,public static Singleton getInstance (), {,, ,,,if (instance ==, null), {,, ,,,,,,,instance =, new 单例();,, ,,,},, ,,,return 实例;,, ,,,},, }