`
walsh
  • 浏览: 433132 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

java设计模式-----Singleton Pattern(单例模式)

阅读更多
前些天摆弄java,参考一些资料写了个数据库连接池,对里面只产生一个实例的那种做法深表佩服,今天中午又听到别人在说设计模式,受不了了,就上网Down了点资料来。
  一来就看到了Singleton模式,一看,呀,不就是那个连接池里用的方法么?!噢,原来如此。
  Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点。
  为了实现 Singleton 模式,我们需要一个静态的变量,能够在不创建对象的情况下记忆是否已经产生过实例了。静态变量或静态方法都可以在不产生具体实例的情况下直接调用,这样的变量或方法不会因为类的实例化而有所改变。
  实现 Singleton 模式的办法通常有三种:
  1.用静态方法实现 Singleton;
  2.以静态变量为标志实现 Singleton;
  3.用注册器机制来创建 Singleton。
  对于上面3种方法,我觉得第一种很好用,写的连接池用了第一种和第三种方法。用第一种方法使得怎么取都是那一个连接池,用第三种方法使得只存在那一个连接池。
  第一种方法具体实现为:
  声明构造函数为 private,防止通过除由我们提供的方法之外的任意方式来创建一个实例,如果不把构造函数声明为private,编译器就会自作聪明的自动同步一个默认的friendly构造器。下面是摘抄的一个例子:
  public class Singleton
  {
  private static Singleton s;
  private Singleton()
  {
  };
  
  public static Singleton getInstance()
  {
  if (s == null)
  s = new Singleton();
  return s;
  }
  }

  // 测试类
  class singletonTest
  {
  public static void main(String[] args)
  {
  Singleton s1 = Singleton.getInstance();
  Singleton s2 = Singleton.getInstance();
  if (s1==s2)
  System.out.println
  ("s1 is the same instance with s2");
  else
  System.out.println
  ("s1 is not the same instance with s2");
  }
  }
  
  singletonTest运行结果是:
  
  s1 is the same instance with s2
  
  这证明我们只创建了一个实例,再怎么取都是那个实例,很简单也很实用。

  对于第二种实现方法,在类中加入一个静态变量做为标志,每次都在构造函数里进行检察。
  下面是我写的一个例子:
  public class Singleton {
   static boolean existInstance=false;
   public Singleton()
   {
   if (existInstance)
    {
     System.out.println("Already exist instanse!");
    }
    else
    {
     //...........................
     System.out.println("Create an instanse!");
     existInstance=true;
   }
  }
  }
  测试类如下:
  public class Test {

   public static void main(String[] args) {
   Singleton s1=new Singleton();
    Singleton s2=new Singleton(); 
   }
  }
  结果为:
  Create an instanse!
  Already exist instanse!
  第二次的时候检测到已经有实例,接下来要怎么做就看自己的了。
  与第一种方法相比,第一种是随便你怎么弄,都是那个实例,第二种是只能在第一次生成一个实例,再往后就会报错了。
  下面来看看第三种方法:用注册器机制来创建 Singleton。
  这种方法首先要建立一个管理器,用集合中的Hashtable 和Enumeration来实现addItem(Object key, Object value),getItem(Object key),removeItem(Object key)等方法实现,将key和value一一关联起来,创建实例前首先用addItem方法进行注册,再用getItem方法获取实例。
  Hashtable中的key是唯一的,从而保证创建的实例是唯一的,用注册器机制来创建 Singleton模式的好处是易于管理,可以同时控制多个不同类型的Singleton 实例。
  现在,我把那个连接池的部分代码弄出来讲讲第三种方法:
  首先,定义个静态的hashtable:
  public static Hashtable pools=new Hashtable();
  当创建连接池成功的时候,把产生的连接池对象放入pools中:
  DBConnectionPool pool=new DBConnectionPool(poolName, url, usr, pwd, max);(DBConnectionPool 是自定义的连接池对象)
  pools.put(poolName, pool);
  取连接的时候,用的是:
  public Connection getConnection(String poolName)
   {
   DBConnectionPool pool=(DBConnectionPool)pools.get(poolName);
    if(pool!=null)
   {
    return pool.getConnection();
    }
    return null;
   }
  前面说了,hashtable中的key值是唯一的,这样,名字为poolName的连接池只能有一个。
  
  讲完了,收摊了,还看不懂我也没话说了.......
分享到:
评论
2 楼 JaneLan 2009-02-20  
return instance;  
1 楼 jjx333 2009-02-11  
你的单例写法,线程不安全的!
应该这样写
class Singleton
{
  private Vector v;
  private boolean inUse;
  private static Singleton instance = new Singleton();

  private Singleton()
  {
    v = new Vector();
    inUse = true;
    //...
  }

  public static Singleton getInstance()
  {
    return instance;
  }
}

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

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

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

    设计模式-Java单例模式的各种实现实例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...

    Singleton pattern单例模式应用

    单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的消耗,比如数据库连接、线程池等,以及确保某个系统配置的一致性。 #...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    java-thread-safe-singleton-pattern.rar_starvation

    在Java编程中,单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。本主题探讨的是线程安全的单例模式实现,特别是饥饿模式(Starvation)和延迟加载(Lazy Initialization)...

    单例模式 Singleton Pattern

    单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其常见,因为它能够帮助开发者控制对象的创建过程...

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...

    优秀的设计模式示例-单例模式

    单例模式是软件设计模式中的一种经典模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。以下是对单例模式的详细...

    java之 ------ 几种常见的简单设计模式

    单例模式是Java中最基础也是最常用的设计模式之一,它帮助我们有效地管理程序中的共享资源。无论是简单的饿汉式还是复杂的懒汉式,开发者可以根据具体的应用场景选择最适合的方式实现。随着并发编程的需求日益增加,...

    设计模式 之 “单例模式[Singleton Pattern]”

    **单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...

    创建型模式之单例模式(Singleton Pattern)

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...

    JAVA单例模式的几种实现方法

    单例模式是软件开发中常用的设计模式之一,用于确保一个类只有一个实例,并提供一个全局访问点。Java中实现单例模式的方法有很多种,每种方法都有其适用场景和优缺点。选择合适的实现方式需要根据实际需求和应用场景...

    java设计模式之单例模式详解

    Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...

    Java设计模式(第二版)中文版

    ### Java设计模式(第二版)中文版 #### 思维框架的培养;对新手与码农均适用 在软件开发领域,设计模式是一种被广泛采用的解决方案,它可以帮助开发者更好地组织代码、解决常见问题,并提高软件的整体质量和可维护...

    JAVA设计模式中的单例模式

    ### JAVA设计模式中的单例模式解析 在软件工程与编程领域,设计模式是解决特定问题的一套被广泛接受的解决方案。其中,单例模式(Singleton Pattern)是一种常用的创建型模式,其核心在于确保一个类只有一个实例,...

Global site tag (gtag.js) - Google Analytics