您的位置:首页 > 职场人生

黑马程序员—java基础学习--单例设计模式

2014-10-06 12:52 381 查看
在日后的开发工作中,单例设计模式是我们必不可少的技能,掌握了单例设计模式将对我们以后的开发工作省去了不少的麻烦,同时也解决了看似困难的问题,究竟是什么样的模式有这么大的功能呢?那么,我今天总结一下单例设计模式,同时也是对以往知识的回顾。

*单例设计模式

设计模式概念:

解决某一类问题最行之有效的方法,最早起源于建筑行业。java中共有23中设计模式。

单例设计模式解决的问题:

解决一个类在内存中只存在一个对象。

保证对象的唯一性步骤:

1,为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象。

2,还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象。

3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

代码体现方式思路:

1,将构造函数私有化;

2,在类中创建一个本类对象;

3,提供一个方法可以获取到该对象。

单例设计模式方式一:饿汉式(开发时常用)

<span style="font-size:14px;">//饿汉式,Single类一进内存,就初始化对象
class Single{

//1,私有化构造函数
private Single(){

}

//2,创建一个本类对象
private static Single s = new Single();

//3,获取到该类对象
public static Single getInstance(){
return s;
}
}

class SingleDemo {
public static void main(String[] args) {
Single s = Single.getInstance(); //类名调用静态方法,返回为Single类型的引用。
}
}</span>


注意:
单例设计模式并非只是这三步骤就解决问题,而是大体思想是这样的,但是对于事物该怎么描述还应该怎么去描述,当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。

单例设计模式的应用如下:

<span style="font-size:14px;">class Student{

private int age;

//私有化创建Student对象
private Student s = new Student();

//私有化构造函数
private Student(){
}

//获取到该对象
public static Student getStudent(){
return s;
}

public void setAge(ing age){
this.age = age;
}

public int getAge(){
return age;
}
}

class SingleDemo {

public static void main(String[] args) {

/*
//以前应该这么做
Student s1 = new Student();
s1.setAge(30);

Student s2 = new Student();
s2.setAge(12);
*/

Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
s1.setAge(30);
System.out.println(s2.getAge());//打印结果为30,单例设计模式应用成功
}
}</span>

单例设计模式方式二:懒汉式(面试时常用)

<span style="font-size:14px;">class SingleDemo2 {

public static void main(String[] args) {

Single s = Single.getInstance();

}
}

//对象是方法被调用时,才初始化,也叫做对象的延时加载。Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
class Single{

//私有化构造函数
private Single(){
}

//创建本类对象,并赋值为null
private static Single s = null;

//提供获取该对象的方法
public static Single getInstance(){
if(s == null){
s = new Single();
}
return s;
}
}</span>

多线程下的懒汉式单例实际模式(知识点较多,需重点掌握)
<span style="font-size:14px;">class Single{

private Single(){
}

private static Single s = null;

public static Single getInstance(){

if(s == null){ //本次判断是否为null是为了高效

synchronized(Single.class){ //同步代码块加锁,锁的对象为Single类的字节码文件

if(s == null){

s = new Single();

}
}
}
return s;
}
}</span>
记录原则:
定义单例,建议使用饿汉式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: