java 单利模式设计原理,饿汉式懒汉式,开发中推荐饿汉式
单例模式的设计:
1 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
1 //对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。 2 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。 3 class Single 4 { 5 private static Single s = null;//创建对象 6 private Single(){}//防止被其他类对该类进行实例化,避免被调用 7 public static Single getInstance() 8 { 9 //A B 10 if(s==null)//如果A,B为空则进入 11 { 12 synchronized(Single.class)//A 进入后 此处功能是防止B进入,加入同步锁 只允许一个实例进入 13 { 14 if(s==null)//A为null 15 //对A进行实例化 再返回同步快12行,此时只有一个对象B,可以进入同步锁,到14行此时对象不为空因为实例化了A ,直接返回S 16 s = new Single(); 17 } 18 } 19 return s; 20 } 21 } 22 23 //记录原则:定义单例,建议使用饿汉式。
1 /* 2 这个是先初始化对象。 3 称为:饿汉式。 4 5 Single类一进内存,就已经创建好了对象。 6 class Single 7 { 8 private static Single s = new Single(); 9 private Single(){} 10 public static Single getInstance() 11 { 12 return s; 13 } 14 } 15 */ 16 17 //对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式。 18 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。 19 class Single 20 { 21 private static Single s = null; 22 private Single(){} 23 public static Single getInstance() 24 { 25 if(s==null) 26 { 27 synchronized(Single.class) 28 { 29 if(s==null) 30 s = new Single(); 31 } 32 } 33 return s; 34 } 35 } 36 37 //记录原则:定义单例,建议使用饿汉式。 38 39 class 40 { 41 public static void main(String[] args) 42 { 43 System.out.println("Hello World!"); 44 } 45 }
饿汉式
1 /* 2 设计模式:解决某一类问题最行之有效的方法。 3 java中23种设计模式: 4 单例设计模式:解决一个类在内存只存在一个对象。 5 6 7 想要保证对象唯一。 8 1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象 9 2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。 10 3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。 11 12 这三部怎么用代码体现呢? 13 1,将构造函数私有化。 14 2,在类中创建一个本类对象。 15 3,提供一个方法可以获取到该对象。 16 17 18 19 对于事物该怎么描述,还怎么描述。 20 当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。 21 22 23 */ 24 25 class Single 26 { 27 28 29 private Single(){} 30 31 private static Single s = new Single(); 32 33 public static Single getInstance() 34 { 35 return s; 36 } 37 } 38 39 40 class SingleDemo 41 { 42 public static void main(String[] args) 43 { 44 Single s1 = Single.getInstance(); 45 Single s2 = Single.getInstance(); 46 47 s1.setNum(23); 48 49 System.out.println(s2.getNum()); 50 51 52 53 // Single s1 = new Single(); 54 // Single s2= new Single(); 55 // s1.setNum(30); 56 // System.out.println(s2.getNum()); 57 58 // Student s1 = new Student(); 59 // s1.setAge(30); 60 // 61 // Student s2 = new Student(); 62 // s2.setAge(12); 63 64 Student s1 = Student.getStudent(); 65 Student s2 = Student.getStudent(); 66 67 68 69 70 } 71 } 72 73 74 75 class Student 76 { 77 private int age; 78 79 80 private static Student s = new Student(); 81 private Student(){} 82 public static Student getStudent() 83 { 84 return s; 85 } 86 87 88 89 public void setAge(int age) 90 { 91 this.age = age; 92 } 93 public int getAge() 94 { 95 return age; 96 } 97 }