單例模式

/*
 * 怎麼可以保證這個類只能產生一個對象?
 * 
 * 思路:
 * 1.問題是其他程序都可以通過NEW創建該類的對象。無法控制數量
 * 所以,不讓其他程序new就ok了
 * 2.那第一步的問題也產生了,那其他程序不就沒有對象了嗎?
 * 乾脆,在奔雷中自己new一個本類對象,這樣的好處是,不讓別的程序new,自己new,可以試想數量控制
 * 3.對外提供讓其他程序獲取該對象的方式,就ok
 * 
 * */

/*
 *  步驟:
 *  1.不讓其他程序new該類對象怎麼處理?
 *  可以將類中的構造函數私有化。
 *  2.在本類中new一個對象。
 *  3.定義一個方法返回該對象
 *  
 */


class Single{//餓漢方式
    
    //創建一個本類對象
    private static Single s =new Single();
    
    //構造函數私有化
    private Single(){}
    
    //定義一個方法返回對象,讓其他程序調用。之所以定義訪問,就是爲了可控
    public static Single getInstance(){
        
        return s;
    }
    
}
/*
 *
    //延遲加載模式
 * class Single{//懶漢方式
 *    
 *        private static Single s =null;
 *        private Single(){}
 *        public static Single getInstance(){
 *            if(s==null){
 *                s=new Single();
 *            }else{
 *                return s;
 *            }
 *        }
 *    }
 * 
 * 
 */



class SingleDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
//        Single s1= Single.s;
//        Single s2= Single.s;
        
//        Single s1= Single.getInstance();
//        Single s2= Single.getInstance();
//        
//        System.out.println(s1==s2);
        
        
        SuperMan man =SuperMan.getInstance();
        man.getName();
        System.out.println(man.getName());
//        SuperMan man1 =SuperMan.getInstance();
//        man1.setName("bb");
//        man1.getName();
    }

}


//單例模式應用


class SuperMan{
    
    private String name;

    //創建一個本類對象
    private static SuperMan man= new SuperMan("fuck");
    
    //構造函數私有化
    private SuperMan(String name){
        
        this.name=name;
    }
    
    //定義一個方法返回對象,讓其他程序調用
    public static SuperMan getInstance(){
        
        return man;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章