zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    USB Descriptors
    回车(carriage return : \r) 换行(line feed : \n)
    SQLSERVER改变已有数据表中的列
    SQLSERVER数据库中的5173错误
    SQLSERVER 在局域网使用Windows身份验证连接局域网内的另一台SQL服务器(不是域环境)
    对于索引假脱机的一点理解
    SQLSERVER备份系统数据库以及何时备份系统数据库
    SQL PROMPT5.3.4.1的一些设置选项
    设置SQLSERVER的错误日志数量和查找SQLSERVER安装错误日志
    谈谈我是如何学习SQL Server的
  • 原文地址:https://www.cnblogs.com/justdoitba/p/9031887.html
Copyright © 2011-2022 走看看