黑马程序员--单例模式

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

单例模式是用于解决一个类在内存中只存在一个对象。

那么想要保证对象唯一:

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

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

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

这三步怎么用代码实现的?

1, 禁止创建该类对象,可以将构造方法私有化。

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

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

 

而单例模式的实现方式有三种(就我目前了解的):饿汉式,懒汉式

饿汉式:先创建对象。HungrySingle类一加载进内存,就创建好了对象hs。

git@code.csdn.net:snippets/254583.git


懒汉式:采用了延时加载。HungrySingle类一加载进内存,对象hs还没有存在,只有调用了getInstance方法时,才建立对象。

	

class HungrySingle{

              privatestatic HungrySingle hs = null;

              //创建一个null的本类对象

              privateHungrySingle(){

//构造方法私有化,不让其他程序创建对象

}

              public HungrySingle getInstance(){

              //延时加载,用到的时候再创建出来就可以了。

                     if(hs== null)

                            hs= new HungrySingle();

                     returnhs;

}    

}

但是,在多线程运行环境下,延时加载就不安全了。所以一般会用到synchronized关键字或者同步代码块,如:

public HungrySingle getInstance(){

              if(s== null){

                     synchronized(Single.class){

                            if(s==null){

                                   s= new Single();

                            }

                     }

              }

              returns;

       }

上面程序可以看到,有双重判断,有同步。这样的程序效率极低。

所以建议使用饿汉式。

 

后来学到了枚举。还可以用枚举的方式实现单例。

张老师视频里有句话:枚举只有一个成员时,就可以作为一种单例的实现方式。

首先,枚举的构造方法必须私有化,这个跟单例的一样,其次枚举就是返回的本类对象。

用枚举的方式先创建对象,而且只有一个,那么调用的时候就只有一个了.例如:

public enum Person{

       ZHANGSAN("张三",20);

       private Stringname;

       private int age;

       public String getName() {

           returnname;

       }

       public int getAge() {

           returnage;

       }

       private Person(String name,int age){

       this.name = name;

       this.age = age;

       }

    }




---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值