《Java基础学习笔记》JAVA设计模式之单例模式

设计模式:

解决某一类问题最告之有效的方法,设计模式是纯思想的! Java中有23种设计模式。

一、单例模式(Single): 解决一个类在内存中只有存在一个对象。

想要保证对象的唯一:

1,为了避免其他程序过多建立该类对象。先控制禁止其它他程序建立对象!
2,还为了其他程序可以访问到该类对象,只好在本类中,自定义一个对象!
3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式!

代码实现步骤:

1,将构造函数私有化。
2,在类中创建一个本类对象。
3,提供一个方法可以获取到该对象。

/********************饿汉式************************/

package com.pattern.single;

/**
 * 饿汉式(建议在开发时使用此方式)
 * 先初始化对象。
 * Singleton类一进内存就创建对象。
 */
public class Singleton
{
    private static Singleton singleton = new Singleton();
    
    private Singleton(){};
    
    public static Singleton GetInstance()
    {
        return singleton;
    }
    
    public void Spreak()
    {
        System.out.println("我的名字是:"+ singleton);
    }
}

/********************懒汉式************************/

package com.pattern.single;

/**
 * 懒汉式(开发中不建议使用此方式,但面试时出题较多,主要提问在多线程下的解决方案)
 * 对象是方法被调用时,才初始化。也叫做对象的延时加载。
 * Singleton类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
 */
public class Singleton
{
    private static Singleton singleton = null;
    
    private Singleton(){};
    
    /*
         * 双重判断并加锁解决多线程下的效率问题。
         */
    public static Singleton GetInstance()
    {
        if(null==singleton)
        {
            synchronized (Singleton.class)
            {
                if(null==singleton)
                    singleton = new Singleton();
            }            
        }
        
        return singleton;
    }
    
    public void Spreak()
    {
        System.out.println("我的名字是:"+ singleton);
    }
}

/****************************华丽的分隔线***************************/

package com.pattern.single;

/**
 * 多线程下的单例解决方案
 */
public class Singleton
{
    private static final Singleton SINGLETON = new Singleton();
    
    private Singleton(){};
    
    public synchronized static Singleton GetInstance()
    {
        return SINGLETON;
    }
    
    public void Spreak()
    {
        System.out.println("我的名字是:"+ SINGLETON);
    }
}

/****************************华丽的分隔线***************************/

package com.pattern.single;

public class Program
{
    public static void main(String[] args)
    {
        Singleton singleton = Singleton.GetInstance();
        singleton.Spreak();
        
        Singleton singleton1 = Singleton.GetInstance();
        singleton1.Spreak();
                
        Singleton singleton2 = Singleton.GetInstance();
        singleton2.Spreak();
        
        Singleton singleton3 = Singleton.GetInstance();
        singleton3.Spreak();
    }
}

 

posted @ 2013-01-05 14:07  陈晓明  阅读(176)  评论(0编辑  收藏  举报