class="MsoNormal">Software?entities?should?be?open?for?extension,but?closed?for?modification——Bertrand?Meyer
?
如果把编程比作战争,那么设计模式就是36计。
首先,让我来介绍一下设计模式中最简单的一种——单例模式
?
什么叫单例模式呢?
一山难容二虎,古代皇帝只有一个;现代社会女人不好惹,老婆只能有一个。
在计算机的世界里,有一些东西也是比较霸道的,比如说配置文件,线程池,缓存,日志文件等等。有了两个配置文件,就要考虑到一致性问题,没事儿找事儿干;有两个缓存,浪费资源还要考虑同步问题,费力不讨好。
单例模式的目的就是使得单例类的一个对象成为系统中该类的唯一实例。
?
在明白了什么是单例以及单例模式的用处之后,我们要怎么实现单例模式呢?
实现单例模式有两种方法:懒汉模式和饿汉模式
?
首先我来介绍一下懒汉模式
?
创建一个Singleton类来实现单例,保证整个应用程序中这个类的实例有且只有一个
?
package com.elf.SimpleMode; /* * 单例模式Singleton * 应用场合:有些对象只需要一个就足够 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型:饿汉模式、懒汉模式 */ public class Singleton { }
?当我们要使用这个类的时候,就需要实例化一个这个类的对象,那么我新建一个主类Test.java
?
package com.elf.SimpleMode; public class Test { new Singleton(); new Singleton(); }
?我们可以通过构造方法实例化多个该类的实例,要想实现工程中有且只有该类的一个实例,那么我们要从该类的构造方法入手。
1.将构造方法改为私有方法,那么在外部就不能直接使用构造方法创建实例了,哎呀!这不整坏了嘛!
? ? 别急啊,现在想想唯一能创建该类的实例的是谁呢?对,该类本身~~
2.创建一个该类的唯一实例
?
package com.elf.SimpleMode; /* * 单例模式Singleton * 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型:饿汉模式、懒汉模式 */ public class Singleton { //1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){ } //2.创建类的唯一实例 Singleton instance=new Singleton(); }
?可是没法实例化该类的对象,还是没法得到这个实例啊!你逗我~~
?
?别急,那不是有一种不用实例化对象也可以调用的属性吗?
?对,聪明的你一下就猜中了,就是static属性
?
package com.elf.SimpleMode;
/*
* 单例模式Singleton
* 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式、懒汉模式
*/
public class Singleton {
//1.将构造方法私有化,不允许外部直接创建对象
private Singleton(){
}
//2.创建类的唯一实例,使用static修饰
static Singleton instance=new Singleton();
}
?变成了这样之后,那么外部也就可以得到这个类的实例了
?
?
package com.elf.SimpleMode; public class Test { public static void main(String[] args) { //饿汉模式 Singleton s1=Singleton.instance(); Singleton s2=Singleton.instance(); if(s1==s2){ System.out.println("s1和s2是同一个实例"); }else{ System.out.println("s1和s2不是同一个实例"); } } }
?得到的结果是:
?
?
s1和s2是同一个实例
?也就是说,无论这里实例化多少个对象,其实都是同一个,这不就实现了嘛!
?
为了控制访问,为了安全,我们可以这个属性改为私有属性,然后添加一个get方法
?
package com.elf.SimpleMode; /* * 单例模式Singleton * 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型:饿汉模式、懒汉模式 */ public class Singleton { //1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){ } //2.创建类的唯一实例,使用private static修饰 private static Singleton instance=new Singleton(); //3.提供一个用于获取实例的方法,使用public static修饰 public static Singleton getInstance(){ return instance; } }
?那么现在呢!这个Singleton类也就完美了。
?
Test.java
?
package com.elf.SimpleMode; public class Test { public static void main(String[] args) { //饿汉模式 Singleton s1=Singleton.getInstance(); Singleton s2=Singleton.getInstance(); if(s1==s2){ System.out.println("s1和s2是同一个实例"); }else{ System.out.println("s1和s2不是同一个实例"); } } }
?同样得到:
?
s1和s2是同一个实例
?~~~这就是单例模式中的懒汉模式实现方法~~~
?
想知道饿汉模式怎么实现吗?
想知道懒汉模式与饿汉模式的区别吗?
?
********************请点击下一篇,精彩仍在继续***************************
?
?