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

黑马程序员_10_单列设计模式

2014-08-02 21:40 387 查看

黑马程序员——单列设计模式

 -------
android培训、java培训、期待与您交流! ----------

设计模式:顾名思义就是解决一类问题的固定步骤,如建房必须打地基---起柱子---砌墙---封顶---装修。

单列设计模式:定义是必须保证一个类在内存中只有一个对象。

从应用场景来看又分为:饿汉式单例设计模式,懒汉式单例设计模式。

饿汉式单列设计模式步骤:

1、私有化构造函数,这样别人就不能通过new关键随意创建对象了。

2、但是必须保证一个类在内存中有一个对象,所以在本类中创建一个本类的对象,且声明一个变量指向。

3、提供一个公共的静态的方法获取本类的对象。

class Single{

//2声明本类的一个引用类型变量并且指向该类对象。

private static Single s = new Single();

//1私有化构造函数。

private Single(){}

//3提供一个公共的静态方法获取本类的对象。

public static Single getInstance()

{

return s;//返回一个对象

}

}

class Instance

{

public static void main(String[] args){

//获取本类的一个对象。

Single s1 = Single.getInstance();

Single s2 = Single.getInstance();


System.out.println(s1==s2);//输出结果是ture

}

}

[/code]

注意:饿汉式单例设计模式,提供的公共方法必须是静态方法。在成员位置声明本类的一个引用类型变量且指向该类对象,如果别人没使用到,会出现资源浪费问题。

懒汉式单例设计模式步骤:

1、私有化构造函数。

2、声明本类的引用类型变量,但不创建本类的对象。

3、提供一个公共静态的方法创建本类的对象并且返回,在创建之前必须要先判断是否已经创建了该类的对象, 如果已经创建了那么直接返回即可,如果没有创建那么先创建再返回。

代码如下:

//懒汉式

class Single2{

//声明本类的引用类型变量,但是不创建本类的对象。

private static Single2 s;


//私有化了构造函数

private Single2(){}


//提供一个公共静态的方法创建本类的对象并且返回。

public static Single2 getInstance(){

if(s==null){//判断s是否已经创建

s = new Single2();

}

return s;

}

}

class Test

{

public static void main(String[] args)

{

      //获取到了本类的一个对象。

Single2 s1 = Single2.getInstance();

Single2 s2 = Single2.getInstance();

System.out.println("是同一个对象吗?"+ (s1==s2));//输出结果是ture

}

}

[/code]

推荐使用:饿汉式单例设计模式,因为懒汉式存在线程安全问题。

懒汉式单例设计模式:事先不做,什么时候需要什么时候创建对象。但存在线程安全。

饿汉式单例设计模式:事先先做,先把对象给创建,但缺点是如果没人使用,浪费资源。

懒汉式单列设计模式存在着线程安全问题,那该如何解决呢?

我们可以采用同步代码块进行双重判断解决该类问题。

这种方法又叫延时加载单例设计模式:

代码如下:

package itheima;

//懒汉式

class Single{

//声明本类的引用类型变量,但是不创建本类的对象。

private static Single s;

//私有化了构造函数

private Single(){}

//提供一个公共静态的方法创建本类的对象并且返回。

public static Single getInstance(){

//采用双重判断,这样只有第一次需要判断锁,

if(s==null){

//锁采用本类字节码文件,保证锁的唯一

synchronized (Single.class) {

if(s==null){//判断s是否已经创建

s = new Single();

}

}

}

return s;

}

}

[/code]

采用双重判断,大大提高了效率。不采用同步函数,是因为每次进来都需要判断锁,效率低。

 -------
android培训、java培训、期待与您交流! ----------

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