1. 定义
单例模式,就是确保在整个系统中某个类只有一个实例,这个实例向整个系统提供服务。
2. 优点
(1) 节省内存开支
(2) 减少系统性能开销,当一个对象的产生需要较多资源(如,读取配置,产生其它依赖对象),可以在系统
启动时直接产生一个单例对象,jvm要注意垃圾回收
(3) 避免对资源的多重占用,如写文件
3. 缺点
(1) 没有接口,扩展困难
(2) 单例模式与单一职责相冲突
4.应用场景
(1) 要求生成唯一序列号的环境
(2) 在整个web项目中需要一个共享数据,如web页面上的计数器,使用单例 保存,并确保线程安全
(3) 创建一个对象,需要消耗过多资源,如访问IO和数据库资源
5.注意事项
(1) 高并发情况下,注意线程安全
(2) 如果单例的类实现了Cloneable类,则对象是可复制的,所以类不要实现Cloneable接口
1 public class SingleTon { 2 private static SingleTon st = null; 3 private SingleTon(){} 4 5 public static synchronized SingleTon getInstance(){ 6 7 if(st == null){ 8 st = new SingleTon(); 9 } 10 11 return st; 12 } 13 } 14 15 /* 16 * 扩展:多例模式 17 */ 18 class Multiton { 19 20 private final static Integer multiNum = 2; 21 private static List<Multiton> multiTonList = new ArrayList<Multiton>(); 22 private static int countNum = 0; 23 private String name; 24 25 private Multiton(){} 26 27 static { 28 for(int i = 0 ; i < multiNum ; i ++){ 29 Multiton mt = new Multiton(); 30 mt.setName("Name-" + i); 31 multiTonList.add(mt); 32 } 33 } 34 35 public static Multiton getMultiton(){ 36 Random random = new Random(); 37 //在0-1之间随机取一个数小 38 countNum = random.nextInt(multiNum); 39 40 return multiTonList.get(countNum); 41 } 42 43 public String getName() { 44 return name; 45 } 46 47 public void setName(String name) { 48 this.name = name; 49 } 50 51 52 53 }