`

单件模式 singleton

阅读更多

     概述:我们很多时候需要一个类只产生一个实例。类似双击金山词霸一个金山词霸的进程运行起来了,然后你在双击并没有在运行一个新的进程。运行两个程序除了浪费资源以外没有任何其他作用。另外有时后生成多个对象还会出现意想不到的问题。

单件模式:确保一个类只有一个实例,并提供一个全局访问点。

实现分析:要保证只有一个实例,就不能让客户代码能够 new 出这个类的一个对象来。而应该让这个类本身来管理对象的实例化,如果没有生成对象就生成一个新对象,已经存在就把这个对象 return 出去。
namespace singleton
{
   
public class SingletonClass
    
{
        SingletonClass singletonClass;
        
private SingletonClass()
        
{
        }

        
public static SingletonClass getInstance()
        
{
            
if (singletonClass == null)
            
{
 System.Threading.Thread.Sleep(100);
                singletonClass 
= new SingletonClass();
            }

            
return singletonClass;
        }

    }

}

看看调用代码:
 class Program
    
{
        
static void Main(string[] args)
        
{
            System.Threading.Thread thread 
= new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ThreadMethod));
            thread.Start();

            
for (int i = 0; i < 100; i++)
            
{
                Console.WriteLine(
"主线程"+SingletonClass.getInstance().GetHashCode());
            }

        
            Console.ReadLine();
        }


        
public static void ThreadMethod(object o)
        
{
            
for (int i = 0; i < 100; i++)
            
{
                Console.WriteLine(
"子线程"+SingletonClass.getInstance().GetHashCode());
            }

        }

    }


运行结果:
......
子线程39086322
子线程39086322
子线程39086322
主线程45653674
主线程39086322
主线程39086322
主线程39086322
主线程39086322
......
从运行结果看多线程情况下会发现产生了两个对象。...看来还有改进的必要。
 public class SingletonClass
    
{
       
static SingletonClass singletonClass   = null;  
       
private static object  obj= new object();
      
        
private SingletonClass()
        
{
        }

        
public static SingletonClass getInstance()
        
{
            
lock (obj)
            
{
                
if (singletonClass == null)
                
{
                    System.Threading.Thread.Sleep(
100);
                    singletonClass 
= new SingletonClass();
                }

            }

            
return singletonClass;
        }

    }

这次没有发现有不同的对象。不过每次调用getInstance()都会加锁,这样好像有点浪费啊。因为事实上执行了一次之后就不会为null了,生成一个对象之后对方法的调用都会加锁然后什么也不做然后解锁这样的代码肯定不太合理。

 public static SingletonClass getInstance()
        
{
            
if (singletonClass == null)
            
{
                
lock (obj)
                
{
                    
if (singletonClass == null)
                    
{
                        //System.Threading.Thread.Sleep(
100);
                        singletonClass 
= new SingletonClass();
                    }

                }

            }

            
return singletonClass;
        }


这样好像代码已经完整了。
另外:1.Head First 中 是这样申明唯一实例变量的 static volatial SingletonClass singletonClass   = null;  volatial 是防止编译器做不必要的优化。保证每次都是从内存中取值而不是是从寄存器中取得副本。从而在另一个线程中对该对象的改变该线程都能获得正确的值。
2 从 运行结果还可以看出一个怪异的地方
子线程39086322
子线程39086322
子线程39086322
主线程45653674
主线程39086322
主线程39086322
主线程39086322
主线程39086322

首先产生了一个对象,然后产生第二个对象。根据我们的逻辑我们使用的对象就是第二个对象了(hashcode 为 45653674)但是从打印的结果看除了一个为第二个对象的hashcode 外,所有的都是第一个对象的hashcode.这个问题先不想了,有时间再补上吧
分享到:
评论

相关推荐

    设计模式 单件模式 设计模式 单件模式

    "设计模式-单件模式" 单件模式是指确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法。单件模式是一种非常实用的设计模式,它可以控制一个类的实例数量,使得调用者可以从...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

    设计模式 之 单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...

    面向对象设计模式:Singleton 单件(创建型模式)

    李建忠面向对象设计模式视频精讲:Singleton 单件(创建型模式)

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...

    C++设计模式课件12_Singleton_单件模式.pdf

    ### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...

    C#面向对象设计模式纵横谈\2 创建型模式Singleton单件模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第2节:创建型模式Singleton单件模式

    C#单件模式例子 内含C#编写源代码

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在C#编程中,单例模式被广泛应用于那些需要频繁创建和销毁的对象,比如线程池、数据库...

    单件模式试做--static的使用

    单件模式(Singleton Pattern)是设计模式中的一种结构型模式,它的主要目的是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,例如日志服务、线程池、数据库连接等...

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    设计模式之单件模式

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

    C#设计模式,单件模式,C#代码

    C#作为.NET框架的主要编程语言,广泛应用于各种复杂系统开发,其中单件模式(Singleton Pattern)是C#开发者经常会遇到的一种设计模式。本资源旨在帮助初学者理解并应用单件模式,通过关键代码实例,让你快速掌握这...

    单件模式源代码

    单件模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制实例化过程或者资源管理的场景中尤其适用,例如日志服务...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳实践。在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式...

    深入浅出设计模式之单件模式

    单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都非常有用,比如管理共享资源(如内存、文件句柄等)、作为...

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

    在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...

    单件模式demo

    单件模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以避免因对象创建和销毁带来的开销,同时...

    设计模式——单实例模式、单件模式——Java编写

    单实例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个系统运行过程中只有一个实例存在,并提供一个全局访问点,以保证所有对该类对象的访问都指向这个唯一的实例。这种模式在Java中广泛应用于配置管理...

    用单件模式写的写日志文件(VC版)

    单件模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++编程中,单件模式通常用于管理共享资源,比如日志系统,因为它需要在整个应用程序中被多个组件访问,...

Global site tag (gtag.js) - Google Analytics