研磨设计模式之单例模式(内部类)
在Java的单例模式里面,很多人都知道懒汉式要比饿汉式更优雅,这里我想告诉你的是,我这里,有一种更优雅的单例设计模式。
1、什么是类级内部类? 简单点说,类级内部类指的是,有static修饰的成员内部类。如果没有static修饰的成员式内 * 部类被称为对象级内部类。
2、类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此 * 可以直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。
3、类级内部类中,可以定义静态的方法。在静态方法中只能引用外部类中的静态成员方法或变量。
4、类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。
大家都知道,在多线程开发中,为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控制, 但是在某些情况下,JVM已经隐含的为您执行了同步,这些情况下就不用自己再来进行同步控制了。
1、由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时
2、访问final字段时
3、在创建线程之前创建对象时
4、线程可以看见它将要处理的对象时
要想很简单的实现线程安全,可以采用静态初始化器的方式,它可以由JVM来保证线程的 安全性。比如前面的饿汉式实现方式。但是这样一来,不是会浪费一定的空间吗?因为这种 实现方式,会在类装载的时候就初始化对象,不管你需不需要。 如果现在有一种方法能够让类装载的时候不去初始化对象,那不就解决问题了?一种可行的方式就是采用类级内部类,在这个类级内部类里面去创建对象实例。这样一来,只要不使用到这个类级内部类, 那就不会创建对象实例,从而同步实现延迟加载和线程安全。
java中常用的设计模式有哪些?
您好:
java中的设计模式有23种,具体如下:
创建型
抽象工厂模式、工厂方法、建造者模式、原型模式、单态模式
结构型
适配器模式、桥接模式、组合模式、外观模式、装饰者模式、享元模式、代理模式、
行为型
责任链模式、命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式
常见的有七种,具体如下:单例模式、工厂模式、建造(Builder)模式、观察者模式、适配器(Adapter)模式、代理模式、装饰模式
举个例子:
通过调用getInstance()方法来创建实例。
其他不一一举例,仅供参考!希望对你有帮助
设计模式之单例模式
单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。
下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。
如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。比如,配置信息类,全局 ID 生成器等。
要实现一个单例,我们要考虑以下几点:
懒汉式相对于饿汉式的优势是 「支持延迟加载」 。但缺点也很明显,因为使用了 synchronized 关键字导致这个方法的 「并发度很低」 。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,就会导致性能瓶颈,这种实现方式就不可取了。
这是一种既支持延迟加载、又支持高并发的单例实现方式。
在 java1.5 以下 instance = new Singleton(); 有指令重排问题,需要给 instance 成员变量加上 volatile 关键字,java1.5 之后不会再这个问题。
这种方式利用了 Java 的静态内部类,有点类似饿汉式,但又能做到了延迟加载。
当外部类 Singleton 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。
这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。
上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢?
假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。
我们通过一个 ConcurrentHashMap 来存储对象,其中 key 是线程 ID,value 是对象。这样我们就可以做到,不同的线程对应不同的对象,同一个线程只能对应一个对象。实际上,Java 语言本身提供了 ThreadLocal 工具类,可以更加轻松地实现线程唯一单例。
java开发在什么情况下使用单例模式?
使用原则如下:
1.单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例
2.单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)
单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
在Java中,单例设计模式是什么意思?有什么优势?
单例模式:保证一个类在使用过程中,只有一个实例。
优势就是单例模式的作用,这个类永远只有一个实例。
还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收。
java的学习建议:
首先要看书读理论,不一定都懂,因为有一个懂的过程;
然后就是分析代码,看看书上的代码的意思,逐行逐行地看,去体会;
最重要的一点就是敲写代码,刚开始不会没关系,照着书一行一行的敲,然后运行,观察结果,把程序运行结果联系程序代码,学得多一点了就尝试修改代码,改一点点看运行结果有什么变化,便于理解程序内部执行的机制。