zoukankan      html  css  js  c++  java
  • 单例模式--有些类也需要计划生育

      单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
      通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其它实例可以被创建,并且它可以提供一个访问该实例的方法。

      单例模式又可以分为---饿汉式和懒汉式。

    懒汉式:

     1 //单例模式---懒汉式 第一次被使用时,才会被实例化
     2 public class Single {
     3     private static Single instance;
     4     
     5     //构造方法让其private,这就杜丝勒外界利用new创建此类实例的可能
     6     private Single(){}
     7     
     8     //此方法是获得本类实例的唯一全局访问点。返回该类的实例
     9     public static Single getInstance(){
    10         //若实例不存在,则new 一个新实例,否则返回已有的实例
    11         if(instance==null){
    12             instance = new Single();
    13         }
    14         return instance;
    15     }
    16 }

    测试类:

     1 public class TestClient {
     2     public static void main(String[] args) {
     3         Single s1 = Single.getInstance();
     4         Single s2 = Single.getInstance();
     5         //比较两次实例化后对象的结果是实例相同
     6         if(s1==s2){
     7             System.out.println("两个对象是相同的实例");
     8         }else{
     9             System.out.println("不同");
    10         }
    11         //打印结果:两个对象是相同的实例
    12     }
    13 }

    饿汉式:

     1 //单例模式---饿汉式  在自己被加载时就将自己实例化
     2 public class Single2 {
     3     private static Single2 instance = new Single2();
     4     
     5     //构造方法让其private,这就杜绝外界利用new创建此类实例的可能
     6     private Single2(){}
     7     
     8     //此方法是获得本类实例的唯一全局访问点,返回该类的实例。静态方法
     9     public static Single2 getInstance(){
    10         return instance;
    11     }
    12 }

    测试类:

     1 public class TestClient2 {
     2     public static void main(String[] args) {
     3         Single2 s1 = Single2.getInstance();
     4         Single2 s2 = Single2.getInstance();
     5         //比较两次实例化后对象的结果是实例相同
     6         if(s1==s2){
     7             System.out.println("两个对象是相同的实例");
     8         }else{
     9             System.out.println("不同");
    10         }
    11         //打印结果:两个对象是相同的实例
    12     }
    13 }

    =================================================多线程下的单例模式====================================================>>>>>

    多线程下的单例模式:

     1 //多线程时的单例
     2 public class Singleton {
     3     private static Singleton instance;
     4     private static  Object syncRoot = new Object();
     5     
     6     //让构造方法私有,这就杜丝勒外界利用new创建此类实例的可能。不让外界通过new创建对象
     7     private Singleton(){}
     8     
     9     //静态方法
    10     public static Singleton getInstance(){
    11         //先判断实例是否存在,不存在再加锁处理
    12         if(instance==null){
    13             synchronized (syncRoot) {
    14                 if(instance==null){
    15                     instance = new Singleton();
    16                 }
    17             }
    18         }
    19         return instance;
    20     }
    21     /**
    22      * 为什么在外面已经判断了instance实例是否存在,还要在synchronized里面做一次实例是否存在的判断呢?
    23      *     对于instance存在的情况,就直接返回,这没有问题。
    24      *  当instance为null并且同时又两个线程调用getInstance()方法时,他们都可以通过第一重instance==null的判断。然后由于synchronized机制,
    25      *      这两个线程则只有一个进入,另一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入。
    26      *          而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这个就没有达到单例的目的了。
    27      */
    28 }
  • 相关阅读:
    codeforces628D. Magic Numbers (数位dp)
    hdu5432Rikka with Array (数位dp+十进制转化为二进制)
    LA3902 Network (树上dfs)
    zoj3494 BCD Code(AC自动机+数位dp)
    codeforces #345 (Div. 1) D. Zip-line (线段树+最长上升子序列)
    zjnu1786 PROSJEK(二分)
    九度1497:面积最大的全1子矩阵 (单调队列,单调栈)
    zjnu1726 STOGOVI (lca)
    zjnu1735BOB (单调队列,单调栈)
    uva10859 Placing Lampposts (树形dp+求两者最小值方法)
  • 原文地址:https://www.cnblogs.com/lixianyuan-org/p/9524130.html
Copyright © 2011-2022 走看看