`
youyu4
  • 浏览: 425347 次
社区版块
存档分类
最新评论

Java设计模式一: 单例模式(Singleton)

 
阅读更多

单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例.

如资源管理器, 访问存放配置文件的类,log,httpApplication.
通常Singleton模式有几种形式:

一: 使用全局变量
//Singleton with final field 
public class Singleton
{
    public static final Singleton instance = new Singleton();
    
    private Singleton(){}
    
    ...
}
在这种方法中,公有静态成员是一个final域(保证了总是包含相同的对象引用)。私有构造函数仅被调用一次,用来实例化公有的静态final域 Singleton.uniqueInstance。由于缺少公有的或者受保护的构造函数,所以保证了Singleton的全局唯一性:一旦 Singleton类被实例化之后,只有一个Singleton实例存在——不多也不少。使用此Singleton类的程序员的任何行为都不能改变这一点。

 

 


二: 使用公有的静态工厂方法(又叫饿汉式单例类)
//Singleton with static factory   
public class Singleton {   
    private static Singleton uniqueInstance = new Singleton();   
    private Singleton(){   
    }   
    public static Singleton getInSingleton(){   
        return uniqueInstance;   
    }   
    //...Remainder omitted   
}  

 

 


三: 延迟实例化的做法,也是公有的静态工厂方法(又叫懒汉式单例类)
public class Singleton{
    private static Singleton instance = null;

    private Singleton(){
        //to do
    }

    public static Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }

        return instance;
    }
}

懒汉式以时间换取空间,每次获取实例都要判断,浪费时间,但是如果一直没人用,就会节省空间.饿汉式以空间换取时间,当类装载时,创建出一个实例,运行时不需要判断,节省了运行时间

 

 


四: 延迟实例化的做法,也是公有的静态工厂方法(又叫懒汉式单例类),并且线程安全
public class Singleton {   
    private static Singleton uniqueInstance ; 
  
    private Singleton(){   
    } 
  
    public synchronized static Singleton getInSingleton(){   
        if(uniqueInstance == null){   
            uniqueInstance = new Singleton();   
        }   
        return uniqueInstance;   
    }   
}   

 

 

 


五: Sington类的序列化 
public class Singleton implements Serializable{      
     
    private static final long serialVersionUID = 5765648836796281035L;      
    public static final Singleton uniqueInstance = new Singleton();      
    private Singleton(){      
    }      
    //...Remainder omitted      
    public static void main(String[] args) throws Exception{      
        //序列化      
         ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\Singleton.obj"));      
         Singleton singleton = Singleton.uniqueInstance;               
         objectOutputStream.writeObject(singleton);      
         objectOutputStream.close();      
         //反序列化      
         ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\Singleton.obj"));      
         Singleton singleton2 = (Singleton)objectInputStream.readObject();      
         objectInputStream.close();      
         //比较是否原来的实例      
         System.out.println(singleton==singleton2);      
   }       
}
 
输出结果为:false

解决方法是为Singleton类增加readResolve()方法:

Java代码
//readResolve 方法维持了Singleton的单例属性  
    private Object readResolve() throws ObjectStreamException{  
        return uniqueInstance;  
    } 

再进行测试:输出结果为true 

总结:
某些情况下使用单例模式可以节省资源,但是单例模式不只是为了节省资源,它是为了确保在整个应用期间只有一个实例, 以达到用户的特定使用目的.
单例模式也有一些坏处,首先,它扩展困难因为静态函数不能生成子类的实例, 所以如果扩展,只能重写.
隐式使用使结构不是很清晰.
可能导致内存泄露.
如果你的类希望以后能得到很好的扩展,最好不用单例模式.

分享到:
评论

相关推荐

    Java 单例模式Singleton

    简单的单例模式举例Singleton 分为恶汉式 懒汉式

    singleton_单例模式_java_设计模式_

    java设计模式,单例模式的不同实现方式

    java 设计模式 单例模式

    //单例模式,始终只产生一个对象 /*public class SingleTest { public static void main(String[] args) { SingleTon singleTon1=SingleTon.getInstance(); SingleTon singleTon2=SingleTon.getInstance(); ...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...

    JAVA设计模式23种

    设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new一样频繁. 设计模式...

    Design-Patterns-Singleton:单例设计模式示例

    这是单例设计模式的基本示例。 您将在此仓库中找到两个示例。 首先是线程安全的单例,其次不是。 测试的输出是: synchronizedTest Started... Thread 2 instance is : ...

    Java面向对象(高级)- 单例(Singleton)设计模式

    Java面向对象(高级)-- 单例(Singleton)设计模式

    单例模式 Singleton Pattern

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...

    Java设计模式之单例模式及其应用

     Java中单例模式的定义是:一个类只有一个实例,而且自行实例化并且向整个系统提供这个实例。  优点:由于单例模式在内存中只有一个实例,减少了内存开支和系统的性能开销;单例模式可以避免对资源的多重占用。 ...

    设计模式整理(很全)

    创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new一样频繁....

    单例模式Java实现

    单例模式是最简单的一种设计模式,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 本资源提供了用java语言实现简单的单例模式,供初学者参考

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    java 三种设计模式Demo 其中对单例模式做了详细的讲解,及性能和线程安全方面的优化其中Singleton.java为经典单例模式。

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    面向对象初学者必须掌握的几种设计模式

    观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量...

    Java设计模式之单态模式(Singleton模式)介绍

    主要介绍了Java设计模式之单态模式(Singleton模式)介绍,本文讲解了如何使用单例模式、使用单例模式注意事项等内容,需要的朋友可以参考下

    Java与模式

    实用的 java 设计原则 和 设计模式,阅读完本书,可以了解java的api背后的设计思想和理念。1000多页巨著,只有超值,没有之一。 第1章 模式的简史和形而上学 第2章 统一建模语言UML简介 第12章 简单工厂\(Simple ...

    设计模式_单例模式.zip

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo

    33种JAVA设计模式DEMO

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...

    单例设计模式.pdf

    单例模式(Singleton Pattern)是 Java 中最常见的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    Java设计模式单例模式(Singleton)用法解析

    主要介绍了Java设计模式单例模式(Singleton)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics