设计模式之单例模式
1、饿汉单例模式(静态常量)
package sjms.dlms;
public class Test01 {
public static void main(String[] args) {
Singer singer1 = Singer.getInstance();
Singer singer2 = Singer.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer {
private Singer () {
}
private final static Singer INSTANCE = new Singer();
public static Singer getInstance() {
return INSTANCE;
}
}
2、 单例模式 饿汉(静态代码块)应用实例
package sjms.dlms;
public class Test02 {
public static void main(String[] args) {
Singer02 singer1 = Singer02.getInstance();
Singer02 singer2 = Singer02.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer02 {
private Singer02 (){
}
private static Singer02 INSTANCE;
static {
INSTANCE = new Singer02();
}
public static Singer02 getInstance() {
return INSTANCE;
}
}
3、懒汉(线程不安全的写法)
package sjms.dlms;
public class Test03 {
public static void main(String[] args) {
Singer03 singer1 = Singer03.getInstance();
Singer03 singer2 = Singer03.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer03 {
private static Singer03 instance;
private Singer03(){
}
public static Singer03 getInstance() {
if(instance == null){
instance = new Singer03();
}
return instance;
}
}
4、懒汉(线程安全,同步方法)
package sjms.dlms;
public class Test04 {
public static void main(String[] args) {
Singer04 singer1 = Singer04.getInstance();
Singer04 singer2 = Singer04.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer04 {
private static Singer04 instance;
private Singer04(){}
public static synchronized Singer04 getInstance(){
if(instance == null){
instance = new Singer04();
}
return instance;
}
}
5、懒汉(线程安全,同步代码块)
package sjms.dlms;
public class Test05 {
public static void main(String[] args) {
}
}
class Singer05 {
private static Singer05 instance;
private Singer05(){}
public static Singer05 getInstance(){
if(instance == null){
synchronized (Singer05.class){
instance = new Singer05();
}
}
return instance;
}
}
6
package sjms.dlms;
public class Test06 {
public static void main(String[] args) {
Singer06 singer1 = Singer06.getInstance();
Singer06 singer2 = Singer06.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer06 {
private static volatile Singer06 instance;
private Singer06(){}
public static Singer06 getInstance() {
if(instance == null) {
synchronized (Singer06.class) {
if(instance == null) {
instance = new Singer06();
}
}
}
return instance;
}
}
7
package sjms.dlms;
public class Test07 {
public static void main(String[] args) {
Singer07 singer1 = Singer07.getInstance();
Singer07 singer2 = Singer07.getInstance();
System.out.println(singer1 == singer2);
System.out.println(singer1.hashCode());
System.out.println(singer2.hashCode());
}
}
class Singer07 {
private Singer07() {}
private static class SingerInstance {
private static final Singer07 INSTANCE = new Singer07();
}
public static Singer07 getInstance(){
return SingerInstance.INSTANCE;
}
}
8
package sjms.dlms;
public class Test08 {
public static void main(String[] args) {
Singer09 singer = Singer09.INSTANCE;
Singer09 singer1 = Singer09.INSTANCE;
System.out.println(singer1 == singer);
System.out.println(singer.hashCode());
System.out.println(singer1.hashCode());
}
}
enum Singer09{
INSTANCE;
public void method() {
System.out.println("Hello SunY!");
}
}