五、单例模式

    xiaoxiao2022-07-14  172

    单例模式

    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()); } }
    最新回复(0)