`
lushuaiyin
  • 浏览: 691164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式之二 --- Singleton 模式 .

 
阅读更多

【1】基本概念

Singleton 是一种创建性模式,它用来确保只产生一个实例,并提供一个访问它的全局访问点。对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在。

【2】简单分析

我们先来看一下该设计模式的UML结构图:


为了实现 Singleton 模式,我们需要的是一个静态的变量,能够在不创建对象的情况下记忆是否已经产生过实例了。静态变量或静态方法都可以在不产生具体实例的情况下直接调用,这样的变量或方法不会因为类的实例化而有所改变。在上面的模式结构图中的 uniqueInstance 就是这个独立的静态变量,它可以记忆对象是否已经实例化了,在静态方法 getInstance() 中对这个变量进行判断,若没有实例化过就产生一个新的对象,如果已经实例化了则不再产生新的对象,仍然返回以前产生的实例。

【3】如何用java语言来实现该设计模式:以下采用2种方法来实现该模式。

第一种方法:用静态方法实现 Singleton 这种方法是使用静态方法来监视实例的创建。为了防止创建一个以上的实例,我们把构造器声明为 private。这样可以防止客户端程序员通过除由我们提供的方法之外的任意方式来创建一个实例。如果不把构造器声明为private,编译器则会创建一个默认的public的构造器。

具体实现的代码如下:

  1. <spanstyle="font-size:16px;">packagecom.andyidea.patterns.singleton;
  2. publicclassSingleton{
  3. privatestaticSingletons;
  4. /**
  5. *把构造函数设置为private
  6. */
  7. privateSingleton(){
  8. }
  9. /**
  10. *实例化对象的唯一接口
  11. *@return
  12. */
  13. publicstaticSingletongetInstance(){
  14. if(s==null){
  15. s=newSingleton();
  16. }
  17. returns;
  18. }
  19. }</span>
测试类代码如下:

  1. <spanstyle="font-size:16px;">packagecom.andyidea.patterns.client;
  2. importcom.andyidea.patterns.singleton.Singleton;
  3. /**
  4. *设计模式测试类
  5. *@authorAndy.Chen
  6. *
  7. */
  8. publicclassMainClient{
  9. publicstaticvoidmain(String[]args){
  10. Singletons1=Singleton.getInstance();
  11. Singletons2=Singleton.getInstance();
  12. System.out.println("WelcometoAndy.ChenBlog!"+"\n"
  13. +"SingletonPatterns."+"\n"
  14. +"-------------------------------");
  15. if(s1==s2)
  16. System.out.println("s1isthesameinstancewiths2");
  17. else
  18. System.out.println("s1isnotthesameinstancewiths2");
  19. }
  20. }</span>
程序运行的结果如下:

  1. WelcometoAndy.ChenBlog!
  2. SingletonPatterns.
  3. -------------------------------
  4. s1isthesameinstancewiths2
第二种方法:以静态变量为标志实现 Singleton 在类中嵌入一个静态变量做为标志,每次都在进入构造器的时候进行检查。问题在于构造器没有返回类型,如果确定创建一个实例成功与否.一个方法是调用一个函数来检查创建是否成功,然后简单的返回一个来自静态变量的值,但是这样做是不优雅的,而且容易发生错误。比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类,这个类仅仅是调用父类方法,好处是用了自己创建的异常类型,错误信息更加清晰。

具体实现的代码如下:

  1. <spanstyle="font-size:16px;">packagecom.andyidea.patterns.singleton;
  2. publicclassSingleton{
  3. staticbooleaninstance_flag=false;
  4. publicSingleton(){
  5. if(instance_flag)
  6. thrownewSingletonException("Onlyoneinstanceallowed");
  7. else
  8. instance_flag=true;
  9. }
  10. }</span>
异常类代码如下:

  1. <spanstyle="font-size:16px;">packagecom.andyidea.patterns.singleton;
  2. /**
  3. *异常类
  4. *@authorAndy.Chen
  5. *
  6. */
  7. publicclassSingletonExceptionextendsRuntimeException{
  8. publicSingletonException(Stringexception){
  9. super(exception);
  10. }
  11. }</span>
测试类代码如下:

  1. <spanstyle="font-size:16px;">packagecom.andyidea.patterns.client;
  2. importcom.andyidea.patterns.singleton.Singleton;
  3. importcom.andyidea.patterns.singleton.SingletonException;
  4. /**
  5. *设计模式测试类
  6. *@authorAndy.Chen
  7. *
  8. */
  9. publicclassMainClient{
  10. publicstaticvoidmain(String[]args){
  11. System.out.println("WelcometoAndy.ChenBlog!"+"\n"
  12. +"SingletonPatterns."+"\n"
  13. +"-------------------------------");
  14. Singletons1,s2;
  15. //createoneincetance--thisshouldalwayswork
  16. System.out.println("Creatingoneinstance");
  17. try{
  18. s1=newSingleton();
  19. }catch(SingletonExceptione){
  20. System.out.println(e.getMessage());
  21. }
  22. //trytocreateanotherincetanced
  23. System.out.println("Creatingtwoinstance");
  24. try{
  25. s2=newSingleton();
  26. }catch(SingletonExceptione){
  27. System.out.println(e.getMessage());
  28. }
  29. }
  30. }</span>
运行结果如下:

  1. WelcometoAndy.ChenBlog!
  2. SingletonPatterns.
  3. -------------------------------
  4. Creatingoneinstance
  5. Creatingtwoinstance
  6. Onlyoneinstanceallowed
从输出的结果可以看出,第一个实例可以顺利创建,创建第二个实例的时候抛出了我们自定义的异常信息。

分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一性或者全局访问点时非常有用,比如数据库连接、线程池或者缓存管理等。 ...

    PyPI 官网下载 | dask-actor-singleton-1.1.0.tar.gz

    单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在多线程或多进程环境中,单例模式可以避免因创建多个实例而导致的资源浪费或状态不一致的问题。在Python中,实现单例通常...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    大话设计模式--Singleton(单例模式)

    单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...

    设计模式-Singleton与Factory

    设计模式-Singleton与Factory

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

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

    在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...

    设计模式复习题.doc

    "设计模式复习题.doc" 以下是根据给定文件生成的相关知识点: 1. 设计模式的种类: - 工厂方法模式 - 抽象工厂模式 - 单件模式 - 组合模式 - 外观模式 - 观察者模式 - 模板方法模式 - 迭代器模式 - 代理...

    《Java设计模式》课后答案-刘伟.rar

    创建型设计模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们主要关注对象的创建过程,使得代码更加灵活且易于扩展。 结构型设计...

    MyDemo-qt-singleton.7z

    本项目"MyDemo-qt-singleton"着重展示了如何在QT环境中实现单例设计模式。单例模式是一种保证一个类只有一个实例并提供一个全局访问点的设计模式,常用于控制共享资源的访问,如数据库连接、配置文件或线程池。 在...

    C++常见设计模式的解析和实现+源码解析.rar

    常见设计模式的解析和实现(C++)之二-Abstract Factory模式 常见设计模式的解析和实现(C++)之三-Builder模式 常见设计模式的解析和实现(C++)之四-Prototype模式 常见设计模式的解析和实现(C++)之五-Singleton模式 ......

    设计模式PPT---25种设计模式详解

    这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对25种主要的设计模式进行了详尽的阐述。 首先,我们要理解设计模式的基本概念。设计模式不是代码,而是一种...

    PHP 设计模式-design-patterns.zip

    在编程领域,设计模式是一种通用解决方案的模板,用于解决软件设计中反复出现的问题。PHP作为一门广泛应用于Web开发的脚本语言,同样可以利用设计模式来提升代码的可读性、可维护性和可扩展性。"PHP 设计模式-design...

    C#设计模式-吕震宇

    C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式(3) - 设计原则(2) C#设计模式(2...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象编程中最核心的设计原则之一。这些模式可以帮助开发者解决常见的编程问题,并提高代码的可复用性和可维护性。 #### 创建型模式 创建型模式关注的是对象...

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

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

    java-thread-safe-singleton-pattern.rar_starvation

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

Global site tag (gtag.js) - Google Analytics