单例模式

有些东西有且仅有一个,即使复制也是一样的

比如F4,他们都是一个类,4个对象指向那个类,但无论你怎样都是一样的

不像克隆模式,一队5个螳螂,但每个螳螂属性并不相同,属于一个类,但并不具有“唯一性”

所以单例模式的存在就是创造某些类,只要用这个类指向对象,生成的对象都是一样的

单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。

那么如何达到目的呢?

普通类的对象是在main函数里再声明,指向,初始化

那么我们可以在类里通过类属性得到一个对象将这个对象作为一个类方法的返回值,返回给main函数里的某个新对象,但已经达到的目的,每个新对象都是一样的,因为都是在类里已经初始化好,通过方法传递过去的。


饿汉式:

package  charactor;
 
public  class  GiantDragon {
 
     //私有化构造方法使得该类无法在外部通过new 进行实例化
     private  GiantDragon(){
         
     }
 
     //准备一个类属性,指向一个实例化对象。 因为是类属性,所以只有一个
 
     private  static  GiantDragon instance =  new  GiantDragon();
//这个时候,instance就是这个类指向的一个对象,已经实例化
     
     //public static 方法,提供给调用者获取12行定义的对象
     public  static  GiantDragon getInstance(){
         return  instance;
     } //这个方法用于返回上面得到的对象
     
}


package  charactor;
 
public  class  TestGiantDragon {
 
     public  static  void  main(String[] args) {
         //通过new实例化会报错
//      GiantDragon g = new GiantDragon();
         
         //只能通过getInstance得到对象
         
         GiantDragon g1 = GiantDragon.getInstance();
         GiantDragon g2 = GiantDragon.getInstance();
         GiantDragon g3 = GiantDragon.getInstance();
         
         //都是同一个对象
         System.out.println(g1==g2);
         System.out.println(g1==g3);
     }
}

2-懒汉式

package  charactor;
 
public  class  GiantDragon {
  
     //私有化构造方法使得该类无法在外部通过new 进行实例化
     private  GiantDragon(){       
     }
  
     //准备一个类属性,用于指向一个实例化对象,但是暂时指向null
     private   static   GiantDragon instance; 只是声明,没有具体实例化对象
      
     //public static 方法,返回实例对象
     public  static  GiantDragon getInstance(){
         // 第一次访问的时候,发现instance没有指向任何对象,这时实例化一个对象
         if ( null ==instance){
             instance =  new  GiantDragon();
         }
         //返回 instance指向的对象
         return  instance;
     }
      
}
package  charactor;
 
public  class  TestGiantDragon {
 
     public  static  void  main(String[] args) {
         //通过new实例化会报错
//      GiantDragon g = new GiantDragon();
         
         //只能通过getInstance得到对象
         
         GiantDragon g1 = GiantDragon.getInstance();
         GiantDragon g2 = GiantDragon.getInstance();
         GiantDragon g3 = GiantDragon.getInstance();
         
         //都是同一个对象
         System.out.println(g1==g2);
         System.out.println(g1==g3);
     }
}
饿汉式 是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。

懒汉式 ,是延迟加载的方式,只有使用的时候才会加载。 并且有 线程安全 的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。

看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式

什么是单例模式?

回答的时候,要答到三元素
1. 构造方法私有化
2. 静态属性指向实例
3. public static的 getInstance方法,返回第二步的静态属性




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值