zoukankan      html  css  js  c++  java
  • singleTon 模式

    类与类之间是组合关系更好,这样的类与类之间是低耦合,而继承是属于高耦合的关系。
    通过OO隔离变化

    动机:在soft,有这样的类,必须保证他们在系统之中只有一个实例,才能确保他们的逻辑正确性,以及更好的效率,如果通过常规的构造器,提供一种机制来保证一个类只有一个实例。

    意图:保证一个类只有一个实例 ,并提供一个该实例的全局访问点。

    要点:
    singleton中的实例构造器可以设置为protector以允许子类派生。
    singleton一般不要支持ICloneable接口,这样可能导致实例化出多个对象。
    singleton一般不支持序列化
    singleton一般不能应付多线程环境,这样也可能导致出现多个实例
     //应对于单线程
        public class SingletonA
        
    {
            
    private static SingletonA instance;

            
    //一个私有的构造器,禁用构造器
            private SingletonA() {}

            
    public static SingletonA Instance
            
    {
                
    get
                
    {
                    
    if (instance == null)
                    
    {
                        instance 
    = new SingletonA();
                    }

                    
    return instance;
                }

            }

        }


        
    //应对于多线程
        public class SingletonB
        
    {
            
    //volatile关键字用于禁止编译器对指定的顺序进行微调。
            private static volatile SingletonB instance = null;

            
    private static object lockHelper = new object();

            
    //一个私有的构造器,禁用构造器
            private SingletonB() {}

            
    public static SingletonB Instance
            
    {
                
    get
                
    {
                    
    //双锁,用于保证只一个线程使用这里,防止多线程产生多个实例。
                    if (instance == null)
                    
    {
                        
    lock (lockHelper)
                        
    {
                            
    if (instance == null)
                                instance 
    = new SingletonB();
                        }

                        
                    }

                    
    return instance;
                }

            }

        }

    主程序: 

       
       public static void Main()
            
    {
                SingletonA t1 
    = SingletonA.Instance;

                SingletonA t2 
    = SingletonA.Instance;

                Console.WriteLine(
    object.ReferenceEquals(t1, t2) == true);
            }

    singleton模式扩展
    1:将一个实例扩展到N个实例,例如对象池的实现
    2:将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
    3:理解和扩展singleton模式的核心是:如何控制用户使用new对一个类的实例构造器的任意调用。

    带参数的singleton模式:
    public class Singleton
    {
        
    int x;
        
    int y ;
        
    private static Singleton instance;

        
    private Singleton(int x,int y )
        
    {
            
    this.x = x;
            
    this.y = y;
        }


        
    public static Singleton GetInstance(int x,int y )
        
    {
            
    if(instance == null)
            
    {
                instance 
    = new Singleton(x,y);
            }

            
    else
            
    {
                instance.x 
    = x;
                instance.y 
    = y;
            }

            
    return instance;
        }

    }


    public class Test
    {
        
    public static void Main()
        
    {
            Singleton s1 
    = Singleton.GetInstance(100,100);
        }

    }
  • 相关阅读:
    Thread.sleep(0)的意义& 多线程详解
    .NET AOP的实现
    UML详解
    asp.net事件委托易理解实例
    2个或多个datable类似于sql inner join 合并查询
    web.cofing(新手必看)
    JS操作URL
    .net对象转Datable
    NPOI读写Excel
    RSA加密
  • 原文地址:https://www.cnblogs.com/zjbtony/p/714446.html
Copyright © 2011-2022 走看看