java23种设计模式-----单例模式

1.什么是单例模式?
  单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只能生成一个唯一的实例对象。

  保证一个类、只有一个实例存在,同时提供能对该实例进行访问的全局访问方法。


2.为什么要用单例模式?
  1.在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象。
  2.在整个程序空间使用全局变量,共享资源。
  3.在大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

3.分类:
   1.饿汉式:(类加载的时候就创建对象)
     不管是多线程还是单线程都可以保证只有一个类的实例
   2.懒汉式:(需要时才会创建对象)
     在单线程中可以保证只有一个类的实例
     但是在多线程就无法保证了(在方法上加上synchronized就可以保证只有一个实例了)

   3.双重检查:(提高程序的运行效率)


====================================饿汉式===========================================

package com.test;

/**
 * 饿汉式(类加载的时候就创建对象)
 * 
 * @author qianqf
 * 
 */
public class Student {
public static final Student student = new Student();

       //学生姓名
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/**
* 构造函数私有化
*/
private Student() {

}

/**
* 提供一个全局的静态方法
*/
public static Student getStudent() {

return student;

}

}

-----------------------------------------------------------------------

package com.test;

public class Test {
public static void main(String[] args) {
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
s1.setName("张三");
s2.setName("李四");
System.out.println(s1.getName());
System.out.println(s2.getName());
}
}


=============================================懒汉式=============================================

package com.test;


/**
 * 懒汉式(等用到的时候再创建对象)
 * 
 * @author qianqf
 * 
 */
public class Student02 {
private static Student02 student;
private String name;


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


/**
* 构造函数私有化
*/
private Student02() {

}

/**
* 提供一个全局的静态方法,单线程时才能保证一个实例 而多线程时必须使用同步(synchronized),才能保证一个实例
*/
public static synchronized Student02 getStudent() {


if (student == null) {


student = new Student02();

}
return student;
}

}

----------------------------------------------------------------------------------------------------------

package com.test;


public class Test02 {
public static void main(String[] args) {
Student02 s1 = Student02.getStudent();
Student02 s2 = Student02.getStudent();
s1.setName("张三");
s2.setName("李四");
System.out.println(s1.getName());
System.out.println(s2.getName());
}
}


==========================================懒汉式(双重检查)================================================

package com.test;


/**
 * 懒汉式(等用到的时候再创建对象)
 * 
 * @author Administrator
 * 
 */
public class Student03 {
private static Student03 student;
private String name;


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


/**
* 构造函数私有化
*/
private Student03() {

}


/**
* 提供一个全局的静态方法,单线程时才能保证一个实例 而多线程时必须使用同步(synchronized),才能保证一个实例 经过双重检查来提交效率
*/
public static Student03 getStudent() {
if (student == null) {
synchronized (Student.class) {
if (student == null) {
student = new Student03();

}
}
}
return student;
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值