5. 单例模式
5.1 类图
5.2 代码
Singleton :
public class Singleton {
private static Singleton singleton;
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton==null){
singleton = new Singleton();
return singleton;
}
else{
return singleton;
}
}
}
Client :
public class Client {
public static void main(String[] args) {
Singleton singleton = Singleton.getSingleton();
Singleton singleton1 = Singleton.getSingleton();
if(singleton==singleton1){
System.out.println("singleton == singleton1");
System.out.println("是单例模式");
}
else{
System.out.println("不是单例模式");
}
}
}
5.3 模式特点
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,他提供全局的访问方法。
要点:
- 某个类只能有一个实例
- 这个类必须自行创建这个实例
- 他必须向整个系统提供这个实例
单例类拥有一个私有的构造函数,确保用户无法通过new 关键字直接实例化,除此之外,该模式中包含一个静态私有成员变量和静态公有的工厂方法,该工厂方法负责检验实例的存在并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
优点:
- 提供了对唯一实例的受控访问
- 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁得到对象单例模式无疑可以提供系统的性能。
- 允许可变数目的实例。
缺点:
- 实例模式中没有后抽象层,因此单例类的扩展有很大的困难。
- 单例类的职责过重,在一定程度上违背了“单一职责原则”。
- 滥用单例类会带来一些负面问题,如为了节省资源将数据库连接对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。
5.4 适用场景
- 系统只需要一个实例对象
- 客户调用类的单个实例只允许适用一个公共的访问点,除了改访问点之外,不能通过其他途径访问该实例。
需要注意的事项:
- 不要适用单例模式存取全局变量,这违背了单例模式的初衷。
- 不要将数据库连接对象做成单例,因为一个系统可能会与多个数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。
5.5 模式应用
- Java语言类库JDK中就有很多单例模式的应用实例。在每一个Java应用程序中,都有唯一一个
Runtime 对象。 放连接。
5.5 模式应用
- Java语言类库JDK中就有很多单例模式的应用实例。在每一个Java应用程序中,都有唯一一个
Runtime 对象。 - 在流行的Spring框架中,当我们试图从Spring容器中获取某个类的实例的时候,默认情况下,Spring会通过单例模式进行创建,也就是在Spring的bean工厂中这个bean的实例只有一个。
|