java中的单例模式与静态类

单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在《Java中有关单例模式的面试问题》博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务。由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法之间基本的区别是非常重要的,前者给你一个Object,后者仅仅提供静态方法,由于对像比方法具有较强的能力,可以指导你神马时候使用单例模式与静态方法。

在本文中,我们会了解神马Java中的神马地方使用单例模式,神马时候使用静态类更好,顺便说下,JDK中有几个关于两者的例子,并且这例子非常聪明的,例如java.lang.Math是一个final类,并且其方法为静态方法,另一方面java.lang.Runtime是一个单例的类。对于那些不熟悉单例模式或静态类的人,静态类就是一个Java类,它仅包含静态方法,一个非常好静态类的例子就是java.lang.Math,它包括了许多为不同数据功能实现工具方法,例如sqrt(),而单例类,在整个应用生命周期内只有一个实例,例如java.lang.Runtime。

神马时候在Java中使用静态类替换单例

确实存在一些场景,静态类比单例更适合,这个场景中主要的一个例子就是java.lang.Math,它不是单例的,其所有方法都是静态方法,这里我给出几个场景,我觉得使用静态类比单例模式更适合。

1)        如果你的单例不需要维护任何状态,仅仅提供全局访问的方法,这种情况考虑使用静态类,静态方法比单例更快,因为静态的绑定是在编译期就进行的。但是要记住,不建议在静态类中维护状态信息,特别是在并发环境中,若无适当的同步措施而修改多线程并发时,会导致坏的竞态条件。

如果你需要将一些工具方法集中在一起时,你可以选择使用静态方法,但是别的东西,要求单例访问资源时,应该使用单例模式。

Java中单例与静态的区别

这是回答关于单例与静态的第二面试问题,如我早些提到过的,它们基本的区别一个表现类,一个表现方法,下面列几条它们之间的区别。

1)        静态类比单例具有更好的性能,因为静态方法在编译期绑定。

2)        再次,它们的区别是override的能力,因Java中的静态方法是不可以覆盖的,这就导致其木有太多的灵活性,另一面,你可通过继承的方式覆盖单例类中定义的方法。

3)        静态类很难模拟,因此难于单例测试,单例更容易模拟,因为也比静态类易于编写单元测试,不论神马单例期望神马,你都可以传递模拟对象,例如构造方法或方法参数。

4)        如果你的需求中需要维护状态信息,则单例比静态类更适合,因为后者在维护状态信息方面是非常可怕的,并导致狡滑的bug。

5)        如果是一个非常重的对象,单例可以懒加载,但是静态类没有这样的优势,并且非常热切的加载。

6)        许多依赖注入的框架对单例都有良好的管理,例如Spring,使用它们非常容易。

两者之间的这些区别,有助于我们在面对一些场景时做出选择,下一节中了解神马时候选择单例而不是静态类。

Java中,选择单例而不是静态类的优点

单例与静态主要的优点是前者比后者更具有面向对象的能力,使用单例,可以通过继承和多态扩展基类,实现接口和更有能力提供不同的实现,如果我们讨论java.lang.Runtime,在Java中它是单例,调用getRuntime()方法,会基于不同的JVM返回不同的实现,但也保证了每个JVM中实有一个实例,如果java.lang.Runtime是一个静态类,不太可能因不同的JVM返回不同的实现。

这就是Java中单例与静态类的区别,当你需要一个全OO能力的对象时,选择单例,如果仅仅是将一些静态方法预售,使用静态类。

时间: 2024-10-05 11:43:25

java中的单例模式与静态类的相关文章

JAVA中的单例模式(采用单例模式定义的类)(转)

1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类 . 2    确保以上三点的所采用的编程策略     * 把构造方法声明为Private.确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例:    * 定义一个私有静态的该类的实例作为该类的数

Java中的单例模式

Java中的单例模式分为两种:懒汉模式和饿汉模式 懒汉模式代码: 类加载快,在运行时获取对象进度慢 private static Student stu; //创建一个私有的静态学生类对象 private Student(){} //把构造数改成私有的 //单线程 /* public static Student getInstance(){ if(stu==null) // 为空就new一个空间 { stu=new Student(); } return stu; }*/ //双线程 publ

Java中的单例模式(Singleton Pattern in Java)

Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一获取,进程中的其他对象通过这个单例对象获取这些配置信息,这种方式能大大简化复杂环境下的配置管理. 所以这个时候一个类里面就只能有一个实例,而且这个实例要易于访问.我当然可以只定义一个全局变量可以保证对象随时都能访问,但是这种方式我依然可以实例化多个instance,而且被不同的对象所持有,不是很妙.

《Java中的单例模式--两种》

1 //单例模式:饿汉式和懒汉式 2 //单例模式 3 4 /* 5 设计模式:解决某一类问题行之有效的解决办法(思想). 6 单例(Singleton):设计模式: 7 学习设计模式必须先弄清楚它是解决什么问题的. 8 9 单例模式是解决什么问题的? 10 可以保证一个类的对象唯一性. 11 12 场景:比如多个程序都要使用一个配置文件中的数据,而且要实现 13 数据共享和交换.必须要将多个数据封装到一个对象中.而且 14 多个程序操作的是同一个对象.那也就是说必须保证这个配置 15 文件的唯

关于Java中的单例模式

一.特点: ①单例类只能有一个实例 ②单例类必须自己自己创建自己的唯一实例 ③单例类必须给所有其他对象提供这一实例 二.实现方法: ①饿汉式  public class Singleton1{     private Singleton1();     private static Singleton1 single=new Singleton1();     public static final Singleton1 getInstance(){         return single;

Java中如何实现单例模式

Java中,单例模式通常有2种分类饿汉模式和懒汉模式. 饿汉模式指的是单例实例在类装载时就被创建了. 懒汉方式值的是单例实例在首次使用时才被创建. 无论是饿汉模式还是懒汉模式,都是用了一个静态成员变量来存放真正的实例.并且私有化构造函数,防止被外部实例化. 单例(饿汉模式)代码: public class Singleton {     private final static Singleton INSTANCE = new Singleton();     //私有化构造方法,防止被实例化 

JAVA中的饿汉式和饱汉式单例模式及jdk中Runtime类的单例模式实现方式详解

一.描述 单例模式是一种非常常见的设计模式,即一个类只能有一个对象(实例),一般通过将该类的构造器私有化,来阻止在该类外创建该类的对象,并提供给外界一个唯一的对象(这个对象在该类中创建). java中的单例模式常见的有两种实现方式,一种是恶汉方式,即将该类对象用static休息并且在类加载的时候进行初始化:另一种是饱汉方式,在程序中需要用到该对象的时候才初始化,一旦初始化一次就不会再重新生成该对象. JDK中的Runtime类其实也是一种单例模式,而且其采用的是饿汉的方式. 二.源代码 pack

JAVA设计模式中的单例模式

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象.注意:1.单例类只能有一个实例.2.单例类必须自己创建自己的唯一实例.3.单例类必须给所有其他对象提供这一实例. 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点.主

Java中的五种单例模式实现方法

[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package s