zoukankan      html  css  js  c++  java
  • 设计模式1:单例模式(1)

      什么是单例模式?

      保证一个类仅有一个实例,并提供一个访问它的全局访问点。

      作用:在整个生命周期,一个类的所有对象,都是指向了同一块内存空间,而系统不需要为该类的每一个对象都在堆分配空间。任何时候,单例类的实例只有一个。

         
      单例模式是通过单例类来实现的,其中单例类的构成分为三部分:

      1.指定其构造方法为私有的

      2.定义一个公有的类变量作为该类的唯一对象

      3.公开一个公共方法用来获取这个类的唯一实例

        注:类的构造方法我们一般定义为公有的,但它也可以定义为私有,当一个类的构造方法被定义为私有的时候,我们就没法使用这个构造方法了,也就是不能通过这个构造方法来创建该类的对象了,当一个类的所有构造方法都定义为私有,那么我们就无法在该类之外创建这个类的对象,所有就必须提供一个公共的方法,外界通过这个唯一的入口来获取一个已经实例化的类了。

      单例模式有两种:

      1.饿汉式线程安全

      2.懒汉式线程不安全

        其中饿汉式和懒汉式的不同仅在于这个类的唯一实例创建的时机,饿汉式是在外界获取这个实例之前就已经初始化了这个实例,而懒汉式则是在外界第一次获取这个实例的时候才初始化这个实例,以后不再初始化,懒汉式是线程不安全的,原因在于当多个线程都开始创建这个对象时,由于cpu是采用时间片轮转法,可能会返回单例类对象的多个引用,从而导致线程不安全。

      饿汉式:

     1 class SingleInstance{
     2     //定义一个本类的对象
     3     private static SingleInstance singleInstance = new SingleInstance();
     4     
     5     //构造方法私有化:不能在本类的外部通过new创建对象
     6     private SingleInstance(){
     7         
     8     }
     9     
    10     //向外界提供可访问的方法,返回当前类的对象
    11     public static SingleInstance getInstance(){
    12         return singleInstance;
    13     }
    14 }

      懒汉式:

     1 class SingleInstance{
     2     //定义一个本类的对象
     3     private static SingleInstance singleInstance;
     4     
     5     //构造方法私有化:不能在本类的外部通过new创建对象
     6     private SingleInstance(){
     7         
     8     }
     9     
    10     //向外界提供可访问的方法,返回当前类的对象
    11     public static SingleInstance getInstance(){
    12                 if(singleInstance==null)
    13                     singleInstance = new SingleInstance();          
    14         return singleInstance;
    15     }
    16 } 

      示例:创建单例类的两个对象,判断这两个对象的引用是否相同。

     1 package com.pattern;
     2 
     3 public class Test1 {
     4     public static void main(String[] args) {
     5         //创建两个对象
     6         SingleInstance singleInstance1 = SingleInstance.getInstance();
     7         SingleInstance singleInstance2 = SingleInstance.getInstance();
     8         
     9         //打印这两个引用所指向的对象地址
    10         System.out.println("singleInstance1:"+singleInstance1);
    11         System.out.println("singleInstance2:"+singleInstance2);
    12         System.out.println(singleInstance1==singleInstance2);
    13         
    14     }
    15 }
    16 class SingleInstance{
    17     //定义一个本类的对象
    18     private static SingleInstance singleInstance = new SingleInstance();
    19     
    20     //构造方法私有化:不能在本类的外部通过new创建对象
    21     private SingleInstance(){
    22         
    23     }
    24     
    25     //向外界提供可访问的方法,返回当前类的对象
    26     public static SingleInstance getInstance(){
    27         return singleInstance;
    28     }
    29 }
    源代码

      效果:

      单例模式的应用场景:

      

      (图片来源:http://blog.csdn.net/tanyujing/article/details/14160941)

      未完,待续。

      

      

  • 相关阅读:
    Java基础-学习笔记(十)——内部类(嵌套类)
    Java基础-学习笔记(九)——static关键字
    Java基础-学习笔记(八)——函数的参数传递
    JS获取当前时间转成时间戳,并比较两个时间戳得出相差的天数
    tp6的with关联使用(删查),insertAll批量增加
    Vue父子组件的相互调用方法与参数
    Vue父子组件之间的通信
    Vue组价的基本使用
    PHP接入图片文字识别AIP
    EC6模块化的导入和导出
  • 原文地址:https://www.cnblogs.com/enjoy-coding/p/4803518.html
Copyright © 2011-2022 走看看