`
walsh
  • 浏览: 429756 次
  • 性别: 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;
  }
}

相关推荐

    design-pattern-java.pdf

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

    单例模式 Singleton Pattern

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

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...

    33种JAVA设计模式DEMO

    单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器...

    设计模式_单例模式.zip

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

    单例设计模式.pdf

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

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板...

    design-pattern-test:设计模式学习

    工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    JAVA设计模式.rar

    单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  工厂方法模式【FACTORY METHOD PATTERN】 抽象工厂模式【ABSTRACT FACTORY PATTERN】 门面模式【FACADE PATTERN】  适配器模式...

    Java 23种设计模式全归纳

    ### Java 23种设计模式全归纳 #### 资源概述 本资源包汇总了Java中23种经典设计模式的详细介绍和使用示例,旨在帮助开发者系统性地学习和掌握设计模式在软件开发中的应用。这些设计模式分为三大类:创建型模式、...

    uu-design-pattern:23种设计模式案例

    23种设计模式演示代码文件结构图gof23 |- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- ...

    Java聊天室 观察者模式和单例模式

    基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举) ...单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一

    Android SingletonPatternDemo

    Java据说有23种设计模式,Android的设计模式肯定是由Java来引申出来的。这里不讨论有多少人全会,有多少种设计模式会使用到,我们来讲下其中用得最多的也就是人人都知道的单例模式。 这里是一个简单的Singleton...

    java餐饮管理系统源码6-design_patterns:设计模式

    Java设计模式书籍: 大话设计模式 Head First 设计模式 设计模式的类型: 总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、 行为型模式...

    Object-Oriented-Analysis-Design:面向对象的分析和设计(JAVA语言)设计模式,Java GUI

    家庭作业的主题: HW01: PART1->策略设计模式PART2->观察者设计模式PART3->装饰器设计模式HW02: PART1->单例设计模式PART2->迭代器设计模式PART3->状态和观察者模式PART4->代理设计模式中期: PART1->抽象工厂...

    23种设计模式知识要点--更多Java进阶 www.cx1314.cn1

    1.单例模式(Singleton Pattern) 2.工厂模式 3.抽象工厂模式(Abstract Factory 4.模板方法模式(Template Met

Global site tag (gtag.js) - Google Analytics