单例模式
1、什么是单例模式2、为什么要使用单例模式呢?3、单例模式实现1.饿汉式。饿汉模式一饿汉模式二
2.懒汉式。懒汉模式一懒汉模式二
3.双重检查。
1、什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
2、为什么要使用单例模式呢?
在应用系统开发中,我们常常有以下需求:
在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象在整个程序空间使用全局变量,共享资源大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
3、单例模式实现
1.饿汉式。
饿汉模式一
package com.example.demo01;
/**
* 饿汉模式
* @author Guardian
*
*/
public class Person {
public static final Person person = new Person();
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法
public static Person getPersion(){
return person;
}
}
package com.example.demo01;
import com.example.demo01.Person;
public class MianClass {
public static void main(String[] args) {
Person p1 = Person.getPersion();
Person p2 = Person.getPersion();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
饿汉模式二
package com.example.demo02;
/**
* 懒汉模式
* @author Guardian
*
*/
public class Person {
private static Person person;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法
public static Person getPersion(){
if (person == null) {
person = new Person();
}
return person;
}
}
package com.example.demo02;
import com.example.demo02.Person;
public class MianClass {
public static void main(String[] args) {
Person p1 = Person.getPersion();
Person p2 = Person.getPersion();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
2.懒汉式。
懒汉模式一
package com.example.demo03;
/**
* 懒汉解决多线程模式
* @author Guardian
*
*/
public class Person {
private static Person person;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法,使用同步方法(解决多线程问题)
public static synchronized Person getPersion(){
if (person == null) {
person = new Person();
}
return person;
}
}
package com.example.demo03;
import com.example.demo02.Person;
public class MianClass {
public static void main(String[] args) {
Person p1 = Person.getPersion();
Person p2 = Person.getPersion();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
懒汉模式二
package com.example.demo04;
/**
*
* @author Guardian
*
*/
public class Person {
private static Person person;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法
public static Person getPersion(){
if (person == null) {
synchronized (Person.class) {
person = new Person();
}
}
return person;
}
}
package com.example.demo04;
import com.example.demo02.Person;
public class MianClass {
public static void main(String[] args) {
Person p1 = Person.getPersion();
Person p2 = Person.getPersion();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}
3.双重检查。
package com.example.demo05;
/**
* 双重检查模式,解决多线程并发问题
* @author Guardian
*
*/
public class Person {
private static Person person;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){
}
//提供一个全局的静态方法
public static Person getPersion(){
if (person == null) {//两个线程同时进入这个方法时,会出现两个对象
synchronized (Person.class) {
if (person == null) {
person = new Person();
}
}
}
return person;
}
}
package com.example.demo05;
import com.example.demo02.Person;
public class MianClass {
public static void main(String[] args) {
Person p1 = Person.getPersion();
Person p2 = Person.getPersion();
p1.setName("zhangsan");
p2.setName("lisi");
System.out.println(p1.getName());
System.out.println(p2.getName());
}
}