`

设计模式学习 单态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...

分享到:
评论

相关推荐

    设计模式之Singleton(单态)

    设计模式之Singleton(单态)

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

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

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

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

    设计模式之Singleton

    设计模式之Singleton(单态

    JAVA设计模式chm文档

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

    设计模式文档 chm

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

    单态模式的设计和应用

    单态模式的设计和应用--设计模式之Singleton(单态)

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

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

    JAVA设计模式23种

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

    设计模式整理(很全)

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

    网络编程、常用设计模式

    详细的jsp网络编程、常用设计模式! 前言 3 第一部分:网络编程 4 一、了解URL 4 二、读取URL中的资源 4 1、URL构造方法: 5 2、读取资源 5 三、INETADDRESS类 5 四、SOCKET类 6 1、Socket套接字连接 6 2、Socket...

    自己整理的java设计模式模式(袖珍版的哦)

    为了更好的网络共享 本人发布的资源一律免费 如有哪个收费了 请告知! 压缩包 包括常用的几种模式: 设计模式的原则 设计模式袖珍版之-Decorator(油漆工) ...设计模式袖珍版之-Singleton(单态) 设计模式袖珍版之-Visitor

    java设计模式教程+源代码

    Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 ) Adapter ( 适配器模式 ) Bridge ( 桥接模式 ) Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享...

    23种java设计模式

    Factory(工厂模式)、Singleton(单态)、Builder(建造者模式)、Prototype(原型模式)、工厂方法模式。2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器...

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

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

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造者模式10 1.1.4 单态模式13 1.1.5 原型模式15 1.2 构造型模式17 1.2.1 适配器模式17 1.2.2 桥接模式19 1.2.3 组合模式23 1.2.4 装饰模式26 ...

    源码:阎宏设计模式光盘

    com.javapatterns.javaio 专题:设计模式在Java I/O中的应用 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 com.javapatterns.liskov 里氏代换原则 com.javapatterns.lod 迪米特法则 ...

    Java中几个常用设计模式

    1.单例模式(有的书上说叫单态模式其实都一样)  该模式主要目的是使内存中保持1个对象。看下面的例子:  package org.sp.singleton;  //方法一  public class Singleton {  //将自身的实例对象设置为一个...

    java 企业设计模式(框架设计)

    Factory Singleton(单态) Builder Prototype(原型) Flyweight Bridge Decorator(油漆工) Composite(组合) Adapter(适配器) Proxy(代理) Facade(外观 总管 Manager) Visitor Observer

    java 基本设计模式

    Factory Singleton(单态) Builder Prototype(原型) Flyweight Bridge Decorator(油漆工) Composite(组合) Adapter(适配器) Proxy(代理) Facade(外观 总管 Manager) Visitor Observer

Global site tag (gtag.js) - Google Analytics