您的位置:首页 > 编程语言 > Java开发

Java-设计模式-单例模式浅谈

2017-07-04 14:46 357 查看
《\(^o^)/》

单例模式 (Singleton)

单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。


通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个好的办法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

单例模式应用的举例

任务管理器,当你打开你电脑的任务管理器时,会弹出一个对话框。

如果你再去打开任务管理器,就没有新的对话框弹出了。出现在你电脑上的任务管理器只有一个。

单例模式的好处

1.保证一个类仅有一个实例。

2.节省内存,因为它限制了实例的个数,有利于Java垃圾回收

单例模式的实现

饿汉模式

在类加载的时候立即创建该类的单例

如果这个单例在今后一段时间都不使用的话,会浪费大量的时间和空间

懒汉模式

只有需要产生这个实例的时候才去产生

今后再需要的时候,直接返回第一次创建好的实例即可。

看如下例子:

实现两数求和。

饿汉模式

方法类

package 单例模式;
/*
* 步骤:【创建】一个私有的静态的当前类的对象。
*      同时将该类的构造方法设定为私有的。
*      然后提供公共的静态的一个方法 getObj() 去访问私有的静态变量
*/
public class MyClass {
private static MyClass mc = new MyClass();
private MyClass(){

}
public static MyClass getObj(){
return mc;
}
public int add(int x,int y){
return x+y;
}
}


测试类

package 单例模式;

public class TestMyClass {

public static void main(String[] args) {
//实例化m1,m2
MyClass m1 = MyClass.getObj();
MyClass m2 = MyClass.getObj();
//如果 (m1==m2) 返回 true 说明m1和m2地址相同。
//也就是说他们取到的都是方法类中创建的对象mc,实现了单例。
//如果返回false,则没有实现。
System.out.println(m1==m2);
//还可以通过查看比较两个对象的hash码
System.out.println(m1.toString());
System.out.println(m2.toString());
//使用方法求和
System.out.println(m1.add(10, 90));
}

}


运行结果



懒汉模式

方法类

package 单例模式;
/*
* 步骤:【声明】一个私有的静态的当前类的对象。
*      同时将构造方法设为私有
*      然后提供公共的静态的一个方法 getBbj() 去访问私有的静态变量
*      在这个方法中判断对象是否被创建,
*      如果已经被创建,直接使用
*      如果未被创建,先创建,再使用
*/<
a229
/span>
public class MyClass2 {
private static MyClass2 mc ;
private MyClass2(){

}
public static MyClass2 getObj(){
if(mc==null){
mc=new MyClass2();
}
return mc;
}
public int add(int x,int y){
return x+y;
}
}


测试类

package 单例模式;

public class TestMyClass {

public static void main(String[] args) {
MyClass2 m3 = MyClass2.getObj();
MyClass2 m4 = MyClass2.getObj();
System.out.println(m3==m4);
System.out.println(m3.toString());
System.out.println(m4.toString());
System.out.println(m4.add(10, 90));
}

}


运行结果



通过单例模式的两种模式比较,可以看出

懒汉模式是在需要的时候被创建,而饿汉模式是从开始就一直存在着。

懒汉模式可以理解为 我想吃,但是我懒。有饭,我才会张开嘴。

饿汉模式可以理解为 我很饿,我真的饿。喂我,嘴一直张着呢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: