`
心若吾心
  • 浏览: 18666 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

设计优化之单例模式设计

阅读更多

论设计模式的重要性:

目前已有多种流行的设计模式,这些都是针对某一种问题的成熟的解决方案。合理使用设计模式,不仅易于理解所设计的系统,也能使系统结构更加合理。以下是几种常见的设计模式及举例。

 

一、单例模式

简介:单例模式是是设计模式中使用最为普遍的模式之一,它是一种用于对象创建的模式,用来产生一个新的对象,单例,顾名思义就是确保系统中一个类只产生一个实例。

 

优点:对于一些频繁使用又是重量级的对象,只创建实例一次的这种行为省下了大量创建对象花费的时间,而且节约了系统开销;我们都知道java的垃圾回收,对于“new”的次数减少,减轻了垃圾回收的压力,改善了系统性能。

 

实例:单例模式的参与者分为单例类和使用者。单例类提供单例的工厂,返回单例;使用者获取并使用单例。

一个简单的单例实现:

public class Singleton{

private static Singleton instance=new Singleton();
private Singleton(){//private访问级别的构造函数
System.out.println("Singleton is created");
}

public static Singleton getInstance(){
return instance;
}
}

 

单例类中的private级别构造函数保证了单例不会再系统中其他非单例类代码中被实例化。以上单例实现简单,但是有不足之处,就是不能对instance实例做延迟加载。如果此单例的创建过程缓慢,由于instance变量是static的,因此在JVM加载单例类时单例对象就会被建立。如果此时这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量,比如以下代码:

public class Singleton{

private static Singleton instance=new Singleton();

private Singleton(){
System.out.println("Singleton is created");
}

public static Singleton getInstance(){
return instance;
}

public static void test(){
System.out.println("just test");
}
} 

 执行Singleton.test();

输出结果:Singleton is created

               just test

如此可见,此时并不需要使用单例类但是单例类的确被实例化了。为了解决这个问题,引入了延迟加载机制。

public class LazySingleton(){
private static LazySingleton instance=null;

private LazySingleton(){
System.out.println("LazySingleton is created");
}

public static synchonized LazySingleton getInstance(){
if(instance==null){
instance=new LazySingleton();
}
return instance;
}

}

 以上代码对于instance的初始值为null,确保启动系统时没有额外的负载。在getInstance方法中,对instance实例化时要先进行判断,当instance为null时才对其创建。而且对于getInstance方法要进行方法的同步,否则在多线程环境下,在线程1正在新建单例完成new操作之前线程2发现instance仍然为null时,线程2也将新建单例,就会导致多个实例被创建。

虽然延迟加载功能实现了,但是同步关键字的使用大大增加了耗时。童鞋们可以对以上两种单例创建模式亲自测试一下耗时。

为了解决耗时的问题,又进行了如下的改造:

public class StaticSingleton{

private StaticSingleton{
System.out.println("StaticSingleton is created");
}

private static class SingletonHolder{
private static StaticSingleton instance=new StaticSingleton();
} 

public static StaticSingleton getInstance(){
return SingletonHolder.instance;
}

}

 

以上代码中,StaticSingleton被加载时其内部类并不会被初始化,所以instance并不会被实例化,直到getInstance方法被调用时才会加载SingleHolder类,由于实例化是在类加载时完成,故对多线程友好,也不需要同步关键字。

0
0
分享到:
评论

相关推荐

    java设计优化之单例模式

    主要为大家详细介绍了java设计优化中的单例模式,深入学习java单例模式,感兴趣的朋友可以参考一下

    Java单例模式应用研究.pdf

    单例模式是一种最简单的创建型设计模式,主要用于对系统资源的管理与控制,在软件开发中大量使用,如Windows的文件系统、回收站、打印机等。文中通过内容管理系统项目,深入剖析了几种常用的单例类,包括饿汉式单例类、...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    java 三种设计模式Demo 其中对单例模式做了详细的讲解,及性能和线程安全方面的优化其中Singleton.java为经典单例模式。

    常见设计模式—单例模式(Singleton)

    单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...

    java 单例模式

    这个是从《java性能优化》上面截取下来的例子,觉得单例模式还是比较重要的,但是这个从多个方面对单例进行讲解!值得一看

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    单例模式是保证一个类仅有一个实例,并自行提供访问该实例全局访问点的创建型模式。 原型模式用来解决对象的创建问题,它是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的对象 ...

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举) ...单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    浅析php单例模式

    本系列文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 ...

    Android也架构之三:简单工厂模式优化网络请求

    让我们冲现在开始吧,上一篇文章《Android也架构之二:单例模式访问网络》中,我们学会用了单例模式,单例模式一般解决的是和程序相关的问题,和业务逻辑无关,今天开始,我们就开始学习和业务相关的设计模式,拥抱...

    程序优化.pptx

    设计优化 单例模式 代理模式 缓存 负载均衡 2。代码优化 算术优化 一般代码优化 3。容器优化 JVM优化配置 Tomcat优化配置 4。数据库优化 1.减少数据访问 索引 sql的执行计划 2.减少返回的数据 分页

    Android源码设计模式解析与实战

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

    Android 源码设计模式解析与实战

    本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...

    Android源码设计模式解析与实战PDF

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

    Java 设计模式详解超详细(含示例代码)

    创建型模式涉及对象的创建,包括单例模式、工厂模式、原型模式等;结构型模式关注对象之间的结构关系,包括适配器模式、桥接模式、组合模式等;行为型模式则关注对象的交互和职责分配,包括观察者模式、策略模式、...

    《Android 源码设计模式解析与实战》

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

Global site tag (gtag.js) - Google Analytics