java中的单例模式
❶ 单例模式介绍和使用场景及Spring单例模式的使用
1.什么是单例模式单例模式(SingletonPattern)是java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
提供了对唯一实例的受控访问
由于系统中内存只存在一个对象,因此可以节约系统的的资源,对于一些频繁的创建和销毁的对象单例模式无意可以提供系统的性能
单例模式可以允许可变的数目的实例,使用单利模式进行扩展,使用控制单利对象相似的方法获取指定个数的实例,及解决了单利对象,共享过多,而有损性能的问题
2.2单例模式的缺点由于单例模式,不是抽象的所以可扩展性比较差
职责过重,在一定程度上违背了单一职责
滥用单例将带来一些负面的问题,如为了节省资源将数据库连接池对象设计为单例模式,可能会导致共享连接池对象的程序过多未出而出现的连接池溢出,如果实例化对象长时间不用系统就会被认为垃圾对象被回收,这将导致对象状态丢失
2.3单例模式的使用场景开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象。
3.单例模式的12种写法3.1饿汉式(静态变量)publicclassSingleton{=newSingletion();privateSingletion(){}(){returninstance;}}3.2饿汉式(静态常量)publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}3.3饿汉式(静态代码块)publicclassSingleton{;static{instance=newSingleton();}privateSingleton(){}(){returninstance;}}上面三种写法本质上其实是一样的,也是各类文章在介绍饿汉式时常用的方式。但使用静态final的实例对象或者使用静态代码块依旧不能解决在反序列化、反射、克隆时重新生成实例对象的问题。序列化:一是可以将一个单例的实例对象写到磁盘,实现数据的持久化;二是实现对象数据的远程传输。当单例对象有必要实现Serializable接口时,即使将其构造函数设为私有,在它反序列化时依然会通过特殊的途径再创建类的一个新的实例,相当于调用了该类的构造函数有效地获得了一个新实例!
3.4懒汉式(线程不安全)publicclassSingleton{;privateSingleton(){}(){if(instance==null){instance=newSingleton();}returninstance;}}3.5懒汉式(线程安全,存在同步开销)classSingleton{privatestaticSingletonintance=null;privateSingleton(){//私有构造函数}(){if(intance==null){intance=newSingleton();}returnintance;}}3.6懒汉式(线程假装安全,同步代码块)classSingleton{;privateSingleton(){}(){if(singleton==null){//4.加入同步代码块synchronized(Singleton.class){singleton=newSingleton();}}returnsingleton;}}3.7DCL“双重检测锁:DoubleCheckedLock”(假)publicclassSingleton{;privateSingleton(){}(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();}}}returninstance;}}3.8DCL“双重检测锁:DoubleCheckedLock”单例(真)publicclassSingleton{;privateSingleton(){}(){if(instance==null){synchronized(Singleton.class){instance=newSingleton();}}returninstance;}}3.9静态内部类(推荐使用)publicclassSingleton{privateSingleton(){}(){=newSingleton();}(){returnSingletonInstance.INSTANCE;}}3.10枚举类单例模式publicenumSingleton{INSTANCE;privateResourceinstance;Singleton(){instance=newResource();}publicResourcegetInstance(){returninstance;}publicstaticclassResource{privateResource(){}}}3.11登记式单例--使用Map容器来管理单例模式publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}03.12内部枚举类publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}14.Spring依赖注入对单例的使用在AbstractBeanFactory中
publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}24.1doGetBean中{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}34.2getSingleton的实现返回在给定名称下注册的(原始)单例对象,检查已经实例化的单例并允许提前对当前创建的单例的引用(解析循环引用)。
publicclassSingleton{=newSingleton();privateSingleton(){}(){returnINSTANCE;}}4作者:ZhangSan_Plus
❷ 什么是单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。
通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。
使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
(2)java中的单例模式扩展阅读:
优缺点:
优点
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
参考资料:网络---单例模式
❸ Java常用的几种设计模式
下面给你介绍5种设计模式:
1.单例设计模式
所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:
(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个静态方法返回该类的实例。
2.工厂设计模式
程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
3.代理设计模式
指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与上网相关的其他操作(相关业务)。
4.观察者设计模式
所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。
java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。
5.适配器模式
如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。
❹ java 单例模式这个要怎么理解
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例:
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。