单例设计模式(懒汉式,饿汉式)

 

 

 

 

设计模式:解决问题的一种行之有效的思想

单例设计模式:保证了一个类在内存中只能有一个对象,比如多程序访问一个配置文件,希望多程序操作都是同一个配置文件中的数据,那么就需要保证该配置文件对象的唯一性。

思路:1.怎么做才能保证这个对象是唯一的呢?其他程序通过new创建该类对象时根本无法控制个数,那么,就不让其他程序创建该类的对象了,因为不可以控制。2、不让其他程序创建,就该在本类中自己创建一个对象。3、该类将创建的对象对外提供,让其他程序获取并使用。

步骤:1、怎么实现不让其他程序创建该类对象呢?将该类中的构造函数私有化。

比如:class Single

        { 

       private Single();

         }

        2、在本类中创建一个本类对象

比如   class Single

        {

         private Single(){};

         private  Single s = new Single();

         }

       3、定义一个方法,返回值是本类类型。让其他程序通过该方法就可以获得该类对象。但是这个方法一定是public的

比如:

  class Single

  {

     private Single(){};

     private static  Single s = new Single();

     public  static    Single getInstance()

       {

           return s;

       }

  }

}

示例:

package com_package2;

public class Single {
    private Single(){};
    private static Single s= new Single();
    public static Single Instance()
    {
        return s;
        
    }

}
package com_package2;

public class SingleDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        Single s1 = Single.Instance();
        
        // TODO Auto-generated method stub

    }

}

package com_package2;

public class Single {
    private Single(){};
    private static Single s = new Single();
    public static  Single Instance()
    {
        return s;
        
    }
    
}//饿汉式
package com_package2;

public class Single2 {
    private Single2(){};
    private static Single2 s2 = null;
    public static Single2 Instance()
    {
         if(s2==null)
             s2=new Single2();
          return s2;
        
    }

}//懒汉式,也叫做单例的延迟加载方式

开发的时候一般用第一种模式,饿汉式,因为在涉及到多线程的问题式,懒汉式会导致一系列的安全隐患,但是懒汉式是单例模式中的重要考察点

package com_package2;

public class ArrayTool {
private ArrayTool(){};//这句话就不让其他的程序再创建新的对象了。
public static int Max(int []arr) { int max=0; for(int i=1;i<arr.length;i++) { if(arr[i]>arr[max]) { max=i; } else continue; } return arr[max]; } public static int Min(int []arr) { int min=0; for(int i=0;i<arr.length;i++) { if(arr[i]<arr[min]) { min=i; } else continue; } return arr[min]; } }
package com_package2;

public class ArraysDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        int[] a={1,7,4,5,3,3,6};
        int maxs =ArrayTool.Max(a);
        int mins = ArrayTool.Min(a);
        System.out.println("maxs="+" "+maxs);
        System.out.println("mins="+" "+mins);
        // TODO Auto-generated method stub

    }

}

maxs= 7
mins= 1

 

在上面的类中,由于两个方法都没有访问到特有变量,所有都可以加static所以在带有主函数的类中引用这些方法的时候就可以用类名直接调用。

posted on 2015-04-29 18:04  盒子先生金金  阅读(4051)  评论(3编辑  收藏  举报

导航