浅谈JAVASE单例设计模式

 更新时间:2015年11月30日 08:58:18   投稿:hebedich  
整理笔记的时候发现以前写的单利设计模式的文章,贴出来给大家分享下!有需要的小伙伴可以来参考下

简单的说设计模式,其实就是对问题行之有效的解决方式。其实它是一种思想。

1.单例设计模式。

      解决的问题:就是可以保证一个类在内存中的对象唯一性。(单个实例)

      使用单例设计模式需求:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

      如何保证对象唯一性?                                                      解决步骤:

      1.不允许其他程序用new创建该对象。                                            1.私有化该类构造函数。

      2.在该类创建一个本类实例。                                                         2.通过new 在该类中创建一个本类对象。

      3.对外提供一个方法让其他程序可以获取该对象。                            3.定义一个公有的方法,将创建的对象返回。

//饿汉式(开发时常用)
class Single//类一加载,对象就已经存在了。
{
  private static Single s = new Single();
 
  private Single(){}
 
  public static Single getInstance()
  {
    return s;
  }
}
 

 

//懒汉式(面试时常问,在多线程并发访问时候有可能导致不能保证不了对象的唯一性,存在安全隐患!)
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
      //延迟加载形式。 
{
  private static Single2 s = null;
 
  private Single2(){}
 
  public static Single2 getInstance()
  {
    if(s==null)
      s = new Single2();
    return s;
  }
}
 
//调用类
class SingleDemo
{
  public static void main(String[] args) 
  {
    Single s1 = Single.getInstance();
    Single s2 = Single.getInstance();
 
    System.out.println(s1==s2);
     
//   Single ss = Single.s; //此处不采用这个是因为不可控,采用 Single.getInstance();可以传参数进行相应调用。
 
  }
}

饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。

3.登记式:

代码:

package pattern.singleton;import java.util.HashMap;import java.util.Map;
 //登记式单例类.
 //类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
 static{
 Singleton3 single = new Singleton3();
 map.put(single.getClass().getName(), single);
 }
 //保护的默认构造子
protected Singleton3(){}
 //静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
 if(name == null) {
 name = Singleton3.class.getName();
 System.out.println("name == null"+"--->name="+name);
 }
 if(map.get(name) == null) {
 try {
 map.put(name, (Singleton3) Class.forName(name).newInstance());
 } catch (InstantiationException e) {
 e.printStackTrace();
 } catch (IllegalAccessException e) {
 e.printStackTrace();
 } catch (ClassNotFoundException e) {
 e.printStackTrace();
 }
 }
 return map.get(name);
 }
 //一个示意性的商业方法
public String about() {
 return "Hello, I am RegSingleton.";
 }
 public static void main(String[] args) {
 Singleton3 single3 = Singleton3.getInstance(null);
 System.out.println(single3.about());
 }
 }

相关文章

  • SpringBoot中SmartLifecycle的使用解析

    SpringBoot中SmartLifecycle的使用解析

    这篇文章主要介绍了SpringBoot中SmartLifecycle的使用解析,SmartLifecycle是一个扩展了Lifecycle接口,可以跟踪spring容器ApplicationContext刷新或者关闭的接口,实现该接口的实现类有特定的执行顺序,需要的朋友可以参考下
    2023-11-11
  • Spring很常用的@Conditional注解的使用场景和源码解析

    Spring很常用的@Conditional注解的使用场景和源码解析

    今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,本文详细介绍了@Conditional注解的使用场景和源码,需要的朋友可以参考一下
    2023-04-04
  • 详解Java的四种引用方式及其区别

    详解Java的四种引用方式及其区别

    这篇文章主要介绍了Java的四种引用方式 ,主要主要包括强引用,软引用,弱引用,虚引用,稍微整理精简一下做下分享,具有一定的参考价值,需要的朋友可以参考下
    2018-12-12
  • Java如何将二维数组转化为一维数组

    Java如何将二维数组转化为一维数组

    这篇文章主要介绍了Java如何将二维数组转化为一维数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java中常用的Lambda表达式案例解析

    Java中常用的Lambda表达式案例解析

    这篇文章主要介绍了Java中常用的Lambda表达式案例解析,Lambxda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码,下面和我小编一起进入文章学习该详细内容吧
    2022-04-04
  • java8 filter方法、Predicate接口的使用方式

    java8 filter方法、Predicate接口的使用方式

    这篇文章主要介绍了java8 filter方法、Predicate接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 深入理解Java IO的flush

    深入理解Java IO的flush

    本篇文章是小编总结的关于Java IO的flush的相关知识点内容,有需要的朋友可以跟着学习下。
    2018-06-06
  • 详解SpringMVC注解版前台向后台传值的两种方式

    详解SpringMVC注解版前台向后台传值的两种方式

    本篇文章主要介绍了详解SpringMVC注解版前台向后台传值的两种方式,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • 给你的MyBatis-Plus装上批量插入的翅膀(推荐)

    给你的MyBatis-Plus装上批量插入的翅膀(推荐)

    这篇文章主要介绍了给你的MyBatis-Plus装上批量插入的翅膀,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MyBatis Generator使用小结

    MyBatis Generator使用小结

    本文主要介绍了MyBatis Generator使用小结,它能够根据数据库表,自动生成java实体类、dao层接口及mapper.xml文件,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论