标签:
1.定义
保证一个类,在运行期间只有一个实例对象。并提供一个访问他的全局访问点。
结构与说明
Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance方法,让外部访问这个类的唯一的实例。
2.代码示例
1:懒汉式
1 package com.singleton.example1; 2 /** 3 * 懒汉式单例模式示例 4 * @author admin 5 * 6 */ 7 public class Singleton { 8 //定义一个变量用来存储创建好的类的实例 9 private static Singleton uniqueInstance=null; 10 //私有化构造方法 11 private Singleton(){ 12 13 } 14 /** 15 * 定义一个方法来为外部提供类实例 16 * @return 17 */ 18 public static synchronized Singleton getInstance(){ 19 //如果uniqueInstance不存在,就新创建一个 20 if(uniqueInstance==null){ 21 uniqueInstance=new Singleton(); 22 } 23 //如果存在,则直接使用 24 return uniqueInstance; 25 } 26 27 }
2:饿汉式
1 package com.singleton.example2; 2 /** 3 * 饿汉式单例模式示例 4 * @author admin 5 * 6 */ 7 public class Singleton { 8 /** 9 * 定义一个变量来存储定义好的类实例,直接在这里创建类示例,只会创建一次 10 */ 11 private static Singleton uniqueInstance=new Singleton(); 12 /** 13 * 私有化构造方法,好在内部控制创建实例的数目 14 */ 15 private Singleton(){ 16 17 } 18 19 /** 20 * 定义一个方法来为外部提供实例 21 */ 22 public static Singleton getInstance(){ 23 //直接使用创建好的实例 24 return uniqueInstance; 25 } 26 }
3.体会单例模式
场景:现在需要在程序运行过程中读取配置文件
1:不用设计模式的话,如果在系统中存在多处需要使用配置文件的信息时候,如果每次都调用读取配置信息类的构造方法产生新的实例的话,这样会造成内存的严重浪费,是比较损耗资源的。
2:但是如果我们使用单利模式的话,只在系统运行需要读取配置文件的第一次进行实例化读取类的,然后将配置信息保存下来,那么剩余的其他的地方需要的时候我们直接使用以及读取出来的配置信息就可以了,这样在系统运行期间只会产生一个读取配置文件类的实例,相比来说占用了很少的系统资源。
代码示例如下:
1 package com.singleton.example3; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Properties; 6 7 /** 8 * 使用饿汉式单例模式来读取配置文件 9 * @author admin 10 * 11 */ 12 public class AppConfig { 13 /** 14 * 定义一个变量来存储类实例,直接在这进程创建,只创建一次 15 */ 16 private static AppConfig instance=new AppConfig(); 17 18 private String parameterA; //参数A 19 private String parameterB; //参数B 20 21 public String getParameterA() { 22 return parameterA; 23 } 24 public String getParameterB() { 25 return parameterB; 26 } 27 /** 28 * 私有化构造方法 29 */ 30 private AppConfig(){ 31 readConfig(); 32 } 33 /** 34 * 提供一个外部访问实例的接口 35 * @return 36 */ 37 public static AppConfig getInstance(){ 38 return instance; 39 } 40 41 private void readConfig(){ 42 System.out.println("读取一次配置文件======="); 43 Properties p=new Properties(); 44 InputStream in=null; 45 try{ 46 in=AppConfig.class.getResourceAsStream("AppConfig.properties"); 47 p.load(in); 48 this.parameterA=p.getProperty("paramA"); 49 this.parameterB=p.getProperty("paramB"); 50 }catch(IOException e){ 51 System.out.println("读取配置文件出错,具体堆栈信息如下:"); 52 e.printStackTrace(); 53 }finally{ 54 try{ 55 in.close(); 56 }catch(IOException e){ 57 System.out.println("读取配置文件出错,具体堆栈信息如下:"); 58 e.printStackTrace(); 59 } 60 } 61 } 62 }
外部调用代码如下:
1 package com.singleton.example3; 2 3 public class Client { 4 public static void main(String[] args) { 5 for(int i=0;i<5;i++){ 6 AppConfig ac=AppConfig.getInstance(); 7 System.out.println("i=="+i+" paramA="+ac.getParameterA()+" paramB="+ac.getParameterB()); 8 } 9 } 10 }
运行结果如下:
读取一次配置文件=======
i==0 paramA=a1 paramB=b1
i==1 paramA=a1 paramB=b1
i==2 paramA=a1 paramB=b1
i==3 paramA=a1 paramB=b1
i==4 paramA=a1 paramB=b1
4.认识单例模式
1:单例模式的功能
保证一个类在运行期间只有一个实例,同时提供一个外部访问实例的访问点。
2:单例模式的范围
是一个ClassLoader及其子ClassLoader的范围。
3:单利模式的命名
一般建议单例模式的方法命名为:getInstance()。
标签:
原文地址:http://www.cnblogs.com/luoye0726/p/4263083.html