随笔- 3  文章- 0  评论- 8 
2008年8月21日

Intent

    Ensure a class only has one instance, and provide a global point of access to it.

   保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Motivation

    在软件系统中,经常有这样特殊类,必须保证在系统中有且仅有一个实例.就此引出单件模式。

    如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

Structure

            

Case

 

      张三现在要娶个老婆(男女未定),既new一个老婆对象。而社会又如何约束他乖乖的娶个老婆呢?下面引出几个问题  

  • 如何保证张三只能娶一个老婆?
  • 张三风流倜傥,同一时间内跟N个女人来往、拍拖。跟N个女人结婚?
  • 结婚手续基本办妥了,张三性取向突然改变,喜欢男人了。咋办?
  • 张三在中国娶了个老婆,到日本弄了个ID,又娶个老婆?而他还依然还是张三。

Implementation

  •    针对第一个问题,引出Singleton的基本实现
public class WifeSingleton
   
{
       
private static WifeSingleton wifeInstance;
       
private WifeSingleton()
       
{ }
       
public static WifeSingleton WifeInstance
       
{
           
get
           
{
               
if (wifeInstance==null)
               
{
                   wifeInstance 
= new WifeSingleton();
               }

               
return wifeInstance;
           }

       }

    
   }

 

   使用这种方式的前提是张三很专一,很老实.对待MM,没有多线操作。Just like me.^_^。 这种方式一般是不安全的,毕竟跟程序员一样纯洁的人并不多。

  •    针对第二个问题:如何强迫张三娶不到小老婆呢?通过第三方的约束。法律、道德!
public class WifeInLawSingleton
    
{
        
private static volatile WifeInLawSingleton wifeInstance;

        
//通过辅助对象,约束张三只能娶一个老婆
        private static Object Law = new object();
        
/**//// <summary>
        
/// 老婆的外貌
        
/// </summary>

        private string appearance;
        
/**//// <summary>
        
/// 老婆的人品
        
/// </summary>

        private string character;

        
private WifeInLawSingleton(string appearance, string character)
        
{
            
this.appearance = appearance;
            
this.character = character;
        }


        
public static WifeInLawSingleton WifeInstance()
        
{
                
if (wifeInstance==null)
                
{
                    
lock (Law)
                    
{
                        wifeInstance 
= new WifeInLawSingleton(pretty, loyalty);
                    }


                }

                
return wifeInstance;
        }


    }

 这种方式保证了张三只能娶一个老婆,双重锁定,解决了线程的并发问题。对于多线程来说,它是安全的。

至于张三是否去包二奶又是另外一个话题了,通过法律的制约,至少确定了他只能娶一个老婆。

但是,

强迫张三只能娶女人当老婆貌似有违人情,不尽人道。如今绝大多数艺术职业者提倡性自由,无所谓男女。断背山的比比皆是。况且科学发展到今天,男人生育并不是难事.

现在在我们程序中,引入性别为男的老婆。对象的性质不同。咋办呢?

  • 在Framework1.1之前,或许我们得重新修改程序。但在2.0之后,泛型的出现,找个男的老婆就相对简单多了。

 

 


        
public class WifeSingleton<T> where T : new()
        
{

            
private static volatile T wifeSingleton;
            
private static Object law = new object();
            
public static T WifeSingleton
            
{
                
get
                
{
                    
if (wifeSingleton == null)
                    
{
                        
lock (law )
                        
{
                            wifeSingleton 
= new T();   
                        }

                        
                    }

                    
return wifeSingleton;
                }

            }

        }

 

Singleton模式相对简单,暂且先介绍到这。Demo有点牵强,见谅。

------------------------------------------------------------------

参考文献

WebCast 《C#面向对象设计纵横谈》

《Design Patterns, Elements Of Reusable Object Oriented Software》

 

 

 

 

posted @ 2008-08-21 11:27 Aadon 阅读(132) 评论(0) 编辑