java单例模式是什么,什么是单例模式
这篇文章给大家聊聊关于java单例模式是什么,以及什么是单例模式对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
java 单例模式这个要怎么理解
单例模式(Singleton Pattern)是 Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用实例:
1、一个班级只有一个班主任。
2、Windows是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
1、要求生产唯一序列号。
2、WEB中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O与数据库的连接等。
注意事项:getInstance()方法中需要使用同步锁 synchronized(Singleton.class)防止多线程同时进入造成 instance被多次实例化。
JAVA单例模式有哪些
一、懒汉式单例
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
public class LazySingleton{
/**
*私有静态对象,加载时候不做初始化
*/
private static LazySingleton m_intance=null;
/**
*私有构造方法,避免外部创建实例
*/
private LazySingleton(){
}
/**
*静态工厂方法,返回此类的唯一实例.
*当发现实例没有初始化的时候,才初始化.
*/
synchronized public static LazySingleton getInstance(){
if(m_intance==null){
m_intance=new LazySingleton();
}
return m_intance;
}
}
二、饿汉式单例
在类被加载的时候,唯一实例已经被创建。
public class EagerSingleton{
/**
*私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象
*/
private static final EagerSingleton m_instance= new EagerSingleton();
/**
*私有构造方法,避免外部创建实例
*/
private EagerSingleton(){
}
/**
*静态工厂方法,返回此类的唯一实例.
*@return EagerSingleton
*/
public static EagerSingleton getInstance(){
return m_instance;
}
}
**************************************************************************************懒汉方式,指全局的单例实例在第一次被使用时构建;
饿汉方式,指全局的单例实例在类装载时构建
**************************************************************************************
三、登记式单例
这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
public class RegSingleton{
/**
*登记薄,用来存放所有登记的实例
*/
private static Map<String, RegSingleton> m_registry= new HashMap();
//在类加载的时候添加一个实例到登记薄
static{
RegSingleton x= new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}
/**
*受保护的默认构造方法
*/
protected RegSingleton(){
}
/**
*静态工厂方法,返回指定登记对象的唯一实例;
*对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
*@param name
*@return RegSingleton
*/
public static RegSingleton getInstance(String name){
if(name== null){
name="RegSingleton";
}
if(m_registry.get(name)== null){
try{
m_registry.put(name,(RegSingleton) Class.forName(name).newInstance());
} catch(InstantiationException e){
e.printStackTrace();
} catch(IllegalAccessException e){
e.printStackTrace();
} catch(ClassNotFoundException e){
e.printStackTrace();
}
}
return m_registry.get(name);
}
/**
*一个示意性的商业方法
*@return String
*/
public String about(){
return"Hello,I am RegSingleton!";
}
}
什么是单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。
通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。
使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
扩展资料:
优缺点:
优点
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
参考资料:百度百科---单例模式
文章到此结束,如果本次分享的java单例模式是什么和什么是单例模式的问题解决了您的问题,那么我们由衷的感到高兴!