`
Funine
  • 浏览: 13228 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java经典单例模式设计以及一些改进

阅读更多

           一个好的代码,绝对不是靠数量堆上去的,而是靠一个好的,清晰的逻辑,来构建的。就像平常的修房子一样,要先设计好,而不是直接就扛着砖直接盖。在java中的常用的设计模式有,单例模式,装饰者模式,观察者模式,外观模式,工厂模式,模板模式等。在接下来的一个星期内,会好好的介绍一下,自己对于这些设计模式的理解。今天我们先从最简单的单例模式开始。

          很多时候,有些类我们只需要一个实例对象,多了会有问题,像是我们聊天室的管理员,我们的硬件设备打印机等等。那么此时单例模式就提供了一个很好的实现。

          以前我们平常写一个类,在外面可以new出多个对象。

          

 public class A {
	
    }
    public void getA(){
    	A a1=  new A();
    	A a2 = new A();
    }

 

       我们有一个A的类,它可以得到a1,a2两个不同的对象他们分别指向不同的地址值。

      

public class A {
private A(){

}
}

    我们可以通过这样将类私有化之后,那么就不能再外面调用对象。为了得到内部的对象和保证是单一的那么此时,经典的单例模式就出现了。在这里我们以一个用户管理中心为例。

public class UserManage {
private static UserManage um = null;//加载静态对象
//私有化构造是外界不能创建
private UserManage(){

}
//内部进行创建,并将方法,设为共有,供外部调用
public static UserManage getInstance(){
//进行判断,为空时便创建对象
if(um==null){
um = new UserManage();
}
return um;
}
}

    通过静态加载,可以控制它的一个的对象的个数;将构造器私有,只有内部才能调用;最后我们使用getInstance方法,在内部并且当这个方法第一次被调用时,new出对象,并且方法为public 课供外部调用。

     上面所说的都是基本的,经典的单例模式,但是这个是有缺陷的。

      在多线程的情况下,可能多个线程在同一个时间片调用了,getInstance方法,在第一个线程进去的时候,可能第二个也进去了,这时候,第一的对象没有new出来,这时判断也就失效了第二个也new出了对象。这就出现了bug,基于这种比较极端的情况下出现的bug,下面是一些改进的方法。

     方法一:使用同步锁synchronized

   public static synchronized UserManage getInstance(){
    	 if(um==null){
    		 um = new UserManage();
    	 }
    	 return um;
     }

    加上同步锁之后,只能一个线程调用这个方法,前面的以外也就不会出现了。但是,大家都知道,线程锁是非常消耗资源的,如果我们在外面经常调用,就会大大降低程序的性能,当然如果在外面这个方法,调用的比较少就没太大问题呢。

     方法二:“急切”创建法

     

写道
private static UerManage um = new UerManage();

private UserManage(){

}

public static UserManage getInstance(){
return um;
}

    就是在加载类的时候,直接把对象创建出来,就是说类一被加载完成,那么这个对象也就存在了,但是这样就会浪费一些内存资源,可能你在很长时间内都用不到这个方法,或是这个类本身就比较大时是对于资源的浪费。

    方法三:双重检查加锁法

private static UserManage um = null;

private UserManage(){

}

public static UserManage getInstance(){
if(um==null){
synchronized (UserManage.class){
if(um==null){
um = new UserManage();
}
}
}

return um;
}

      此方法也是通过也是通过线程锁来解决,但是这里将线程锁加在第二个判断语句处,当遇到,两个或是多个同时进来的时候,会同时经过那个线程锁,但是只有第一个调用的线程会启动线程锁,在一个整个工程都不会再次用到线程锁,只会在第一次加载的时候使用。这样也很好的保证了,线程的原子性。但是,这样在第一次调用的时候都会加载线程锁,若是这个方法,自始至终都只用到一次,那么也是算浪费了资源。

 

      其实上面介绍了几种对于单例模式的改进,每种都有各自的适用场景。在调用多的时候可以考虑第二,三种,调用次数少时可以考虑第三种,第一种。当然若不是多线程也可以考虑经典模式。不同的场景,应用不同的方法。

    

    

          

分享到:
评论

相关推荐

    Java单例模式应用研究.pdf

    ### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...

    Java单例模式深入理解

    Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...

    java设计模式----单例模式

    单例模式的应用场景包括:控制资源的访问、管理复杂的初始化过程以及在系统中创建一个全局的配置对象等。 单例模式分为两种主要实现方式:饿汉模式和懒汉模式。 1. 饿汉模式(Eager Initialization): 饿汉模式的...

    JAVA单例模式的登录案例

    根据给定的信息,我们可以深入探讨Java单例模式的登录案例,并从中提炼出多个重要的知识点。 ### 单例模式概述 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式通常...

    java设计模式之单例模式

    以上就是8种常见的Java单例模式实现方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择合适的设计模式。在实际开发中,理解并熟练运用这些模式,有助于提高代码质量,降低维护成本。

    单例模式.ppt

    【单例模式】是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个...单例模式虽然方便,但过度使用可能导致设计复杂度增加,不易测试,以及违反了单一职责原则,因此在实际应用中应谨慎使用。

    JAVA单例模式(三种)

    Java单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式被广泛应用于控制资源的共享,例如数据库连接池、线程池或者日志系统等。在本篇文章中,...

    《Java设计模式》课程设计报告.docx

    这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为初学者提供了一个良好的实践平台。 1. **单例模式**: 单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。...

    ava常用设计模式-单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式有多种实现...

    17-Java单例模式的学习笔记1

    Java 单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供全局访问点。这种模式在需要控制类的实例化次数,或者当类的创建是昂贵的操作时非常有用。以下是对不同单例实现方式的详细说明: 1. **懒汉式**...

    单例模式Demo

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、缓存、线程池等场景中非常常见,因为这些场景往往需要一个唯一的对象来协调系统资源或者执行特定的任务。在...

    java设计模式——单例模式

    【Java设计模式——单例模式】 单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统...

    Head First 设计模式 +Java设计模式(第2版)

    这本书通过丰富的图像、故事和幽默的方式,引导读者了解23种经典的GoF(Gang of Four)设计模式,包括单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、代理模式等。书中强调了如何在实际项目中选择和应用...

    java单例设计模式-饿汉式-懒汉式.pdf

    Java 单例设计模式主要分为两种实现方式:饿汉式和懒汉式。这两种方式都是为了确保一个类只有一个实例,并且提供全局访问点。 **饿汉式**: 饿汉式单例在类加载时就完成了实例化,因此是静态常量的方式,确保了线程...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    单例设计模式个人总结+摘录

    - **定义**:改进版的懒汉式单例模式,通过双重检查锁定来提高效率。 - **实现**:首先在静态方法中检查实例是否已经被创建,如果未创建,则同步该方法并再次检查实例是否存在,不存在则创建。 - **特点**:提高...

    java 23种设计模式及具体例子

    * 单例模式:单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个访问该实例的全局点。 * 建造者模式:建造者模式是一种创建型模式,它提供了一种创建复杂对象的方式,而不需要指定它们的类。 * 原型...

    单例设计模式--浅浅笔记

    总的来说,单例模式是设计模式中的一种基础模式,它在软件开发中广泛应用,能帮助我们更好地管理和控制对象的生命周期。不过,过度依赖单例也可能导致设计过于紧密,不利于单元测试和解耦,因此在使用时需要权衡利弊...

    单例模式七种写法_转

    综上所述,单例模式和双重检查锁定的正确实现需要程序员深入理解多线程编程、Java内存模型以及设计模式。在实践中,应当根据具体需求和环境选择合适的实现策略,并注意相关技术的适用性和潜在问题,以确保代码的健壮...

Global site tag (gtag.js) - Google Analytics