`

设计模式学习 单态Singleton

阅读更多

        工作一年了,由于部门职责的限制,虽然也接触了数据库设计、黑白盒测试等工作,但是自己更多的从事编码工作,按照详细设计书上的说明去实现后台业务逻辑。刚开始还有些自己的思想,到最后任务量加大,原本的编码工作完全变成了“Ctrl + C”、“Ctrl + V”的“完美组合”。

    最近决定学习一下设计模式,进行工作之余的自我“充电”。下面进入正题:先从最基础的设计模式——单态模式(Singleton)入手。

 

    单态模式: 即Singleton,它可以保证在Java应用程序中,一个类Class只有一个实例存在。

 

    《Head First-Design Pattern》一书中定义其作用如下:

     The Singleton Pattern ensures a class has only one instance, and provides a global point of access it. (确保每个类只有一个实例,并提供它的全局访问点)

    

    Singleton模式的使用可以节省资源,防止同一类创建多个重复的实例。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

 

    主要有两种形式:

 

第一种形式:

 

 

 

 

public class SingletonPattern { 
      // 构造方法私有化 
    private SingletonPattern (){} 
     
      // 在自己内部定义自己一个实例,注意这是private 只供内部调用
    private static SingletonPattern instance = new SingletonPattern ();    
    // 这里提供了一个供外部访问本class的静态方法,可以直接访问 
    public static SingletonPattern getInstance() {      
        return instance;       
    } 
} 

 

 

 

 

 

第二种形式

 

public class SingletonPattern {   
    private static SingletonPattern singleton= null;   
    public static synchronized SingletonPattern getInstance() { 

     //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次       //使用时生成实例,提高了效率!    
       if (singleton==null) { 
              singleton=new SingletonPattern(); 
          }    
       
       return singleton;    
    } 
} 

 

 

 

    使用SingletonPattern.getInstance()可以访问单态类。

 

 

 

    第二中形式是lazy initialization,即第一次调用时初始SingletonPattern,以后就不用再生成了。

    注意到lazy initialization形式中的synchronized,(这个很重要),如果没有synchronized,那么使用 getInstance()是有可能得到多个Singleton实例。

 

 

 

 

 

 

利用“double-checked locking”来减少getInstance()方法必须是sychronized的改进:

 

 

 

 

 

 

public class SingletonPattern { 

    /** Local Variable */ 
    private static SingletonPattern singleton; 

    /** 
     * Private Constuctor 
     */ 
    private SingletonPattern () { } 
    
    // Get Instance Of SingletonPattern 
    public static SingletonPattern getInstance () { 

        if (singleton == null) { 

            synchronized (SingletonPattern.class) { 

                if (singleton == null) { 
                    singleton = new SingletonPattern(); 
                } 
            } 
        } 
        return singleton; 
    } 
}

 

 

      关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,希望有什么好的见解,大家一起探讨。

 

测试:

 

public class SingletonPatternTest {

    /**
     * Test SingletonPattern Class
     */
    public static void main(String[] args) {
		
        // singleton1
        SingletonPattern singleton1 = SingletonPattern.getInstance();
		
        // singleton2 
        SingletonPattern singleton2 = SingletonPattern.getInstance();
		
        // compare singleton1 to singleton2
        if (singleton1 == singleton2) {
			
            System.out.println("The Instance Of SingletonPattern Class is one-of-a-kind !!");
		
        } else {
			
            System.out.println("The Instance Of SingletonPattern Class is not one-of-a-kind !!");
        }
    }
}

 

输出结果:

 

 

 

The Instance Of SingletonPattern Class is one-of-a-kind !!

 

 

    小弟出来乍到,有什么不对的地方请大家指出。不怕自己错,只怕错了自己不知道。o(∩_∩)o...

分享到:
评论

相关推荐

    JAVA设计模式(单态模式和简单工厂模式)

    单态模式的定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在项目的很多地方都会用到它,比如说数据库的链接。 使用Singleton的好处还在于可以节省内存,因为它限制了实例...

    设计模式之Singleton(单态)

    **设计模式之Singleton(单态)** Singleton设计模式是一种创建型设计模式,它的核心目标是确保在应用程序中只有一个类的实例,并提供一个全局访问点来获取这个唯一实例。这种模式在资源管理、缓存、日志记录、线程池...

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

    单态模式(Singleton模式)是Java设计模式中的一种,它的主要目标是确保一个类在整个应用程序中只有一个实例存在。这种模式的应用场景广泛,特别是在需要全局共享的资源管理、配置中心、日志服务等场合非常常见。 ...

    Java中单态设计模式

    ### Java中单态设计模式详解 #### 一、引言 设计模式是在长期软件开发过程中提炼出来的最佳实践,它们提供了一种标准化的方式用于解决特定类型的问题。对于Java开发者而言,熟悉并掌握各种设计模式是非常重要的,...

    JAVA设计模式chm文档

    设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享...

    设计模式一点通之单态模式

    单态模式(Singleton Pattern)是设计模式中的一种基础模式,主要用来确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,当一个类只能有一个实例而且客户可以从一个众所周知的访问点访问它时,这样的...

    设计模式文档 chm

    设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享...

    单态模式(代码)

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、缓存管理和日志记录等,因为它可以确保在整个系统中...

    设计模式一点通之单态模式 C++

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,且只允许存在一个实例的情况下非常有用,例如配置管理、线程池、缓存...

    Net单态模式的案例

    单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在.NET环境中,无论是C#还是ASP.NET项目,单态模式都是经常被用到的设计模式之一,尤其在处理全局配置、...

    单态模式(PPT)

    单态模式,是一种常用的软件设计模式,其核心思想是确保一个类在整个应用程序中只有一个实例,并提供全局访问点。这种模式的出现主要是为了解决对象创建的控制问题,特别是在某些需要频繁创建和销毁的对象中,单态...

    GoF 23种设计模式的详解与应用

    创建模式:设计模式之Factory,设计模式之Prototype(原型),设计模式之Builder,设计模式之Singleton(单态). 结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite...

    单态模式的设计和应用

    单态模式(Singleton Pattern)是一种常用的软件设计模式,它的核心目标是确保一个类在整个应用程序中只有一个实例,并提供全局唯一的访问点。这种模式在资源管理、配置管理、对象协调等方面有广泛应用,例如创建...

    二十三种设计模式【PDF版】

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

    JAVA设计模式23种

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

    有关static block静态代码块和单态设计模式

    单态设计模式(Singleton Pattern)是一种常见的软件设计模式,它的目标是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处包括资源管理的有效性、性能优化以及简化多线程环境下的同步控制。在Java中,...

    设计模式整理(很全)

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

    .Net单态模式的案例

    单态模式(Singleton Pattern)是设计模式中的一种,它的核心思想是限制类的实例化,确保一个类只有一个实例,并提供全局访问点。在.NET开发中,单态模式被广泛应用于那些需要频繁实例化然后销毁的对象,或者需要...

    单态模式的练习

    单态模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这个模式通常用于控制资源的共享,比如数据库连接、线程池或者配置对象等。在Java或其他面向对象...

    单态模式和简单工厂模式

    单态模式(Singleton Pattern)和简单工厂模式(Simple Factory Pattern)是软件设计中常见的两种创建型设计模式。在Java编程中,它们都是为了简化对象的创建过程,但各自有着不同的应用场景和特点。 单态模式是一...

Global site tag (gtag.js) - Google Analytics