单例模式--笔记

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

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

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

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

2).在整个程序空间启用全局变量,共享资源

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

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

单例模式实现:

1.饿汉式;

2.懒汉式;

3.双重检查

一般实现:

 1 public class Person{
 2
 3     priate String name;
 4
 5     public String getName(){
 6
 7       return name;
 8      }
 9     public String setName(){
10
11       return this.name=name;
12      }
13
14
15    }

主类:

 1 public class MainClass{
 2   public static void main(String[] args){
 3
 4     Person per=new Person();
 5     Person per2=new Person();
 6     //定义变量
 7     per.setName("张三");
 8     per2.setName(“李四”);
 9     //通过person类生成了两个对象
10     System.out.println(per.getName());
11     System.out.println(per2.getName());
12
13   }
14 }

此时,在非单例模式下,定义两个对象,得到了输出结果为:

张三

李四

首先展示的是饿汉式:

 1 public class Person{
 2
 3     priate String name;
 4     public static final Person person =new person();//饿汉式设置
 5      //
 6     public String getName(){
 7
 8       return name;
 9      }
10     public String setName(){
11
12       return this.name=name;
13      }
14     //构造函数私有化
15     private person(){
16
17    }
18    //构造一个全局的静态方法:因为如果不是全局的,那么需要通过对象来进行调用,如果定义成全局的静态,就可以通过类来调用
19    public static Person getPerson(){
20      return new Person();
21       }
22    }

此时,对于主类修改为:

 1 public class MainClass{
 2     public static void main(String[] args){
 3     Person per=Person.getPerson();//不再使用new来定义对象,用类定义
 4     Person per2=Person.getPerson();
 5      //定义变量
 6      per.setName("张三");
 7      per2.setName("李四");
 8     //通过person类生成了两个对象
 9      System.out.println(per.getName());
10      System.out.println(per2.getName());
11
12    }
13  }

得到的结果为:

李四

李四

懒汉式:

 1 public class Person{
 2
 3    priate String name;
 4     private static Person person;//静态初始化默认为null
 5      public String getName(){
 6       return name;
 7       }
 8     public String setName(){
 9
10        return this.name=name;
11       }
12      //构造函数私有化
13      private person(){
14     }
15     public static Person getPerson(){
16     //此处添加一个判断
17      if(person==null)   person=new  Person;
18       return  person();
19        }
20     }

结果为:

李四

李四

上述两种情形各有所长,在饿汉式中,一加载Person类就进行初始化对象,保证同一个对象

在上述懒汉式中,可以保证单线程正常单例模式

允许多线程的懒汉式单例模式:

 1 public class Person{
 2
 3     priate String name;
 4     private static Person person;//静态初始化默认为null
 5       public String getName(){
 6        return name;
 7        }
 8     public String setName(){
 9
10         return this.name=name;
11       }
12       //构造函数私有化
13       private person(){
14      }
15     //使用一个全局的静态方法,使用同步方式
16      public static Synchrogazed Person getPerson(){
17     //当有一个线程进来时,这个方法就被霸占了,对于进来的方法就是将执行完毕在允许其他线程进入
18       if(person==null)  //第一步
19          person=new  Person;  //   第二步
20        return  person();//第三步
21        }
22      }

双重检查:

原因:在上述的多线程代码段中,我们实现的是将整个方法都实现同步,

经过思考,我们可以发现,对于只有第一次的时候才会执行if内的内容;整个方法锁死后,接下来第二次,第三次。。。进来的都要进行判断if语句,影响执行效率

 1   public class Person{
 2
 3       priate String name;
 4       private static Person person;//静态初始化默认为null
 5         public String getName(){
 6          return name;
 7          }
 8       public String setName(){
 9
10          return this.name=name;
11        }
12        //构造函数私有化
13        private person(){
14       }
15      //使用一个全局的静态方法
16       public static  Person getPerson(){
17      //当有一个线程进来时,这个方法就被霸占了,对于进来的方法就是将执行完毕在允许其他线程进入
18        if(person==null) { //第一步
19           Synchrogazed(Person.class){//仅仅同步化这一部分
20           if(person==null)//这个判断语句添加的原因 当有两个线程进来时,第一个线程和第二个线程都执行完              // if(person==null)这条语句,第一个线程进入同步,第二个线程等待,当第一个线程执行完,             //return之后,第二个线程又会执行同步语句,及时第一个线程已经new了一个对象,所以为防止这个情况的发生,             //需要在同步里边再判断一次,也就是第二次判断
21           person=new  Person();}
22          }  //   第二步
23         return  person();//第三步
24         }
25       }
时间: 2024-07-30 13:20:33

单例模式--笔记的相关文章

单例模式笔记

定义 单例模式是限制类的实例只有一个的设计模式. 代码 单线程下的单例模式代码 public class SimpleSingleton { private static SimpleSingleton simpleSingleton; ? private SimpleSingleton() {} ? public static SimpleSingleton getInstance() { // 如果 simpleSingleton 未进行实例化,则创建实例,之后都使用此实例 if (simp

js 单例模式笔记

单例指一个类只有一个实例,这个类自行创建这个实例. 利用对象字面量直接生成一个单例: var singleton = { prop: 1, method: function(){ console.log(a); //1 } } 严格的说对象字面量可能不算单例模式,生成单例是对象字面量的作用(已经被封装),而单例模式是一个设计模式(需要自行构思或设计). 在类内部用new生成实例的单例模式: var instance; var foo = function(){ if(!instance){ in

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

php设计模式笔记:单例模式

意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现: Singleton定义了一个instance操作,允许外部访问它的唯一实例,instance是一个类方法,负责创建它的唯一实例. singleton适用场景: 1.当类只能有一个实例而且外部可以从一个公共的访问点访问它.2.当这个唯一实例应该是通过子类化可扩展的.并且用户应该无需更改代码就能使用一个扩展的实例时. Singl

Head First Design Pattern 读书笔记(4) 单例模式

Head First Design Pattern 读书笔记(4) Singleton Pattern 单例模式 Silngleton Pattern 类图 单例模式非常简单,基本没有什么类之间的关系,就不画图了,保证某个类生成的实例只有一个即可. 定义 单例模式:只允许一个类实例化一个对象,并提供一个可以全局访问这个实例的方法(接口). 关于单例模式 最简单的单例模式实现方法是: /* *"懒汉式"写法,即等要用了再去实例化实例对象,而不是应用一启动就实例化好放在容器中. */ pu

设计模式--单例模式(学习笔记)

定义:      单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点.(<大话设计模式定义>): 单例模式分为两种: 1>饿汉式单例类:自己被加载时就将自己实例化. 例子:       private SingleExample() {           } private static SingleExample singleExample=new SingleExample(); @Override protected SingleExample getInstanc

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

C#设计模式学习笔记-单例模式

最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记. 在<Design Patterns:Elements of Resuable Object-Oriented Software>中的定义是:Ensure a class only has one instance,and provide a global point of access to.它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个.(<设计模式-基于C