设计模式之单例模式学习

前几天在面试的时候,让面试人员在纸上写单例模式,没有一个人写出来。碰巧今天徒弟问我单例的问题,就有了此文。

原因1:现在的孩子太浮躁了,从来没有在纸上写过代码。

原因2:确实在电脑写过,学习的时候写过,后来不用就给忘记了。

单例:经典的设计模式之一,面试的时候最经常被问到。单例,顾名思义:实例唯一。

上码:

package singleton;

/**
 * @说明: 单例模式测试,包括:懒汉模式和饿汉模式
 * @作者: JavaAlpha
 * @日期: 2016年1月22日下午3:19:13
 * @版本: V1.0
 */
public class SingletonTest {

    private String name;
    
    /**
     * @param name The name to set.
     */
    public void setName(String name) {
        this.name = name;
        System.out.println("My Name is " + this.name);
    }

    /**
     * Singleton通过将构造方法限定为private避免了类在外部被实例化,
     * 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
     */
    private SingletonTest(){}

    private static SingletonTest singletonTest = null;
    
    /**
     * 静态工厂方法 
     * 懒汉式单例类.在第一次调用的时候实例化自己 
     * @return
     */
    public static SingletonTest getSingleton() {
        if (null == singletonTest) {
            singletonTest = new SingletonTest();
        }
        return singletonTest;
    }
    
    /**
     * 饿汉式单例类.在类初始化时,已经自行实例化 
     * 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
     */
    private static SingletonTest singletonTest2 = new SingletonTest();
    
    public static SingletonTest getSingleton2() {
        return singletonTest2;
    }
}

//特别注意:事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。

测试类:

package singleton;

/**
 * @说明: 测试类
 * @作者: JavaAlpha
 * @日期: 2016年1月22日下午3:32:45
 * @版本: V1.0
 */
public class SingletonTestMain {

    /**
     * 主测试方法
     * @param args
     */
    public static void main(String[] args) {
        SingletonTest st1 = SingletonTest.getSingleton();
        st1.setName("张三");

        SingletonTest st2 = SingletonTest.getSingleton();
        st2.setName("李四");
        
        if (st1 == st2) {
            System.out.println("是同一个实例");
        }else {
            System.out.println("不是同一个实例");
        }
    }
}


你可能感兴趣的:(JAVA)