• 04单例模式Singleton


    一、什么是单例模式

      单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象。也就是说, 在整个程序空间中,该类只存在一个实例对象。

       其实,GoF对单例模式的定义是:保证一个类、 只有一个实例存在,同时提供能对该实例加以访 问的全局访问方法。

    二、为什么要使用单例模式呢?

      在应用系统开发中,我们常常有以下需求:

        - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象

        - 在整个程序空间使用全局变量,共享资源

        - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

      因为Singleton模式可以保证为一个类只生成唯一的实例 对象,所以这些情况,Singleton模式就派上用场了。

    三、单例模式实现

      1.饿汉式。 2.懒汉式。 3.双重检查。

    饿汉式

     1 //饿汉式
     2 public class Person {
     3     public static final Person person = new Person();
     4     private String name;
     5     
     6     
     7     public String getName() {
     8         return name;
     9     }
    10 
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14     
    15     //构造函数私有化
    16     private Person() {
    17     }
    18     
    19     //提供一个全局的静态方法
    20     public static Person getPerson() {
    21         return person;
    22     }
    23 }

    懒汉式

     1 //懒汉式
     2 public class Person2 {
     3     private String name;
     4     private static Person2 person;
     5     
     6     public String getName() {
     7         return name;
     8     }
     9 
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     
    14     //构造函数私有化
    15     private Person2() {
    16     }
    17     
    18     //提供一个全局的静态方法
    19     public static Person2 getPerson() {
    20         if(person == null) {
    21             person = new Person2();
    22         }
    23         return person;
    24     }
    25 }

    懒汉式同步

     1 //懒汉式,使用同步方法synchronized
     2 public class Person3 {
     3     private String name;
     4     private static Person3 person;
     5     
     6     public String getName() {
     7         return name;
     8     }
     9 
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     
    14     //构造函数私有化
    15     private Person3() {
    16     }
    17     
    18     //提供一个全局的静态方法,使用同步方法
    19     public static synchronized Person3 getPerson() {
    20         if(person == null) {
    21             person = new Person3();
    22         }
    23         return person;
    24     }
    25 }

    双重检查

     1 //双重检查
     2 public class Person4 {
     3     private String name;
     4     private static Person4 person;
     5     
     6     public String getName() {
     7         return name;
     8     }
     9 
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     
    14     //构造函数私有化
    15     private Person4() {
    16     }
    17     
    18     //提供一个全局的静态方法
    19     public static Person4 getPerson() {
    20         if(person == null) {
    21             synchronized (Person4.class) {
    22                 if(person == null) {
    23                     person = new Person4();
    24                 }
    25             }
    26             
    27         }
    28         return person;
    29     }
    30 }

    测试方法

     1 public class MainClass {
     2     public static void main(String[] args) {
     3         Person2 per = Person2.getPerson();
     4         Person2 per2 = Person2.getPerson();
     5         per.setName("zhangsan");
     6         per2.setName("lisi");
     7         
     8         System.out.println(per.getName());
     9         System.out.println(per2.getName());
    10     }
    11 }
  • 相关阅读:
    简单工厂模式
    c# 接口属性继承
    web安全测试---跨站点脚本测试
    web安全测试---WebScarab工具介绍
    Appscan安全漏洞扫描使用(转)
    web安全测试---AppScan扫描工具(转)
    修改DB-LINK连接数方法
    LoadRunner 11破解方法
    数据库学习网站和linux学习网站
    关于误删表可在回收站中闪回
  • 原文地址:https://www.cnblogs.com/justdoitba/p/9031887.html
Copyright © 2020-2023  润新知