您的位置:首页 > 其它

设计模式之使用静态块,静态内部类,枚举类实现单例模式

2017-11-07 21:23 926 查看
传统的实现单例模式的方式:

http://blog.csdn.net/uncle_gy/article/details/77962501

单例模式和多线程:

http://blog.csdn.net/uncle_gy/article/details/78470486

主体代码

class MyObject{
//这是具体的实现方法
}
class MyThread extends Thread{
@Override
public void run(){
System.out.println(Thread.currentThread()+" "+MyObject.getInstance().hashCode());
}
}
public class SingleMain{

public static void main(String[]args){
MyThread thread1=new MyThread();
MyThread thread2=new MyThread();
MyThread thread3=new MyThread();
thread1.start();
thread2.start();
thread3.start();
}
}


使用静态内部类实现

class MyObject{
private static class MyObjectHandler{
private static MyObject myObject=new MyObject();
}
private MyObject(){}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}


运行结果:



使用static代码块实现

class MyObject{
public static MyObject myobject=null;
private MyObject(){}
static {
myobject=new MyObject();
}
public static MyObject getInstance(){
return myobject;
}
}


运行结果:



使用enum枚举类型实现

什么是枚举类型

下面的代码定义了3种颜色,包括颜色的编号和名称,

在枚举类中构造方法是私有的,不允许外界调用,在使用时自动调用,这符合单例模式的要求。

enum Color{
RED("red",0),ORANGE("orange",1),YELLOW("yellow",2);
private String name;
private int num;
private Color(String name,int num){
this.name=name;
this.num=num;
}
public String getName(){
return this.name;
}
public int getNum(){
return this.num;
}
}
public class MyEnum{
public static void main(String[] args){
System.out.println("颜色名称"+Color.RED.getName()+" 颜色编号"+Color.RED.getNum());
}
}


用枚举类实现单例模式

class MyObject{

}
class AssistantObject{

public enum MyEnumClass{
RealObject(new MyObject());
private MyObject myobject;
private MyEnumClass(MyObject myobject){
this.myobject=myobject;
}
public  MyObject getInstance(){
return this.myobject;
}
}
public static MyObject getInstance(){
return MyEnumClass.RealObject.getInstance();
}
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式