设计模式最近感觉非常重要,为自己以后复习做下笔记
package com.yongan.test;
/**
* 此文是观 圣思园视频教程(张龙老师),自己动手写一个单例模式,只供学习参考.
*/
/**
*
* @author huwenbin
* @time 2012-9-26 下午05:07:23
*/
public class SingletonPatternTest {
public static void main(String[] args) {
SingletonPattern1 singleton1 = SingletonPattern1.getInstance();
SingletonPattern1 singleton2 = SingletonPattern1.getInstance();
System.out.println(singleton1 == singleton2);
SingletonPattern2 singleton3 = SingletonPattern2.getInstance();
SingletonPattern2 singleton4 = SingletonPattern2.getInstance();
System.out.println(singleton3 == singleton4);
}
}
/**
* 单例1 (推荐)
*/
class SingletonPattern1{
private static SingletonPattern1 singleton1 = new SingletonPattern1();
/**
* 默认构造函数为private 保证类外部不能实例化(new SingletonPattern1())
*/
private SingletonPattern1(){
}
/**
* 通过类方法返回实例
* @return
*/
public static SingletonPattern1 getInstance(){
return singleton1;
}
}
/**
* 单例2
*/
class SingletonPattern2{
private static SingletonPattern2 singleton2;
/**
* 默认构造函数为private 保证类外部不能实例化(new SingletonPattern2())
*/
private SingletonPattern2(){
}
/**
* 通过类方法返回实例
* @return
*/
public static SingletonPattern2 getInstance(){
if(singleton2 == null){
singleton2 = new SingletonPattern2();
}
return singleton2;
}
}
两种单例方法输出的都是 true 因此单例模式,实现了单例.
但此单例2,在多线程时可能会出现不是单例的情况,比如
if(singleton2 == null){
singleton2 = new SingletonPattern2();
}
当第一个线程执行完if 判断后,进入语句时,此线程时间片结束,第二个线程执行时又可以生成一个实例......
因此此方法要加锁等
单例模式所学内容主要这些!
以上纯属个人观点,如有新想法,我会随时更新单例模式的
欢迎大家斧正,谢谢!