我学习的java单例模式

来源:互联网 发布:esprit淘宝 编辑:程序博客网 时间:2024/05/10 02:24

首先讲解下单例模式:

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

 

作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

 

显然单例模式的要点有三个:

一是某个类只能有一个实例

二是它必须自行创建这个实例

三是它必须自行向整个系统提供这个实例(其实这里个人认为不不是完全正确,但是在ssh中使用的时候,是没有我就new一个,所以在整个系统中不止一个对象,但是绝对不会同时出现两个或以上对象、实例)

 

 

单例模式的应用场景:

①、一些资源管理常常设计成单例模式:比如读取配置文件时候使用单例,应当由一个对象来管理一个属性文件

②、可以使用单例实现缓存机制:把多次生成的文件、对象等资源放在单例的成员变量中,相同条件下,从单例的成员变量中获取(这里的成员变量可以是集合、map等容器)

 

 

优点:节约内存(只有一个实例)

缺点:打破了java的设计原则,即多态,因为单例不能被外部new了,所以单例的构造方法时private的,也就不能被继承了,最终打破了多带原则

 

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。



首先看一个经典的单例实现。

//懒汉模式 用时才创建

public class Singleton {

    private static Singleton uniqueInstance = null;

 

    private Singleton() {

       // Exists only to defeat instantiation.

    }

 

    public static Singleton getInstance() {

       if (uniqueInstance == null) {

           uniqueInstance = new Singleton();

       }

       return uniqueInstance;

    }

    // Other methods...

}


//饿汉式单例类.在类初始化时,已经自行实例化 
2 public class Singleton1 {
3 //私有的默认构造子
4 private Singleton1() {}
5 //已经自行实例化
6 private static final Singleton1 single = new Singleton1();
7 //静态工厂方法
8 public static Singleton1 getInstance() {
9 return single;
10 }
11 }

0 0