保证一个类无法在外部被实例化的三种方法,哪种更加好?
哪一种从逻辑上更说的过去。
谢谢各位。    //1.单实例,构造函数是私有的,无法在外部new
    public class Manager
    {
        private Manager()
        {
        }        private static readonly Manager _Instance = new Manager();        public static Manager Instance
        {
            get
            {
                return _Instance;
            }
        }        private string _Name;
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }        public void Buy()
        {
        }
    }   //2.静态类,无法被实例化
    public static class Manager
    {
        private static string _Name;
        public static string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }        public static void Buy()
        {
        }
    }    //3.抽象类,无法被实例化
    public abstract class Manager
    {
        private static string _Name;
        public static string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }        public static void Buy()
        {
        }
    }

解决方案 »

  1.   

    看需要。
    如果提供的都是静态方法。那就用静态类,如果是单利模式,就private构造函数,提供一个静态的Instance属性。如果不希望别人实例化,做成抽象类实在是乱来了。
      

  2.   


    设计模式中,搞这样的要求:.ctor必须是private的,以此来“保证”。然后再搞个static的GetInstance方法获得全局唯一的实例。其实就算new一个对象出来,然后调用GetInstance方法,又怎么了?lz就是问这个。
      

  3.   

    但是他是从设计模式就是法律的角度,去强调“保证”。而我要问的是,允许new一个实例(尽管懂得的人都知道不用new而直接调用static的GetInstance方法就行),碍谁蛋疼了呢?
      

  4.   


    仔细看完。明白了。
    可能不同的情况。
    如果说多个地方使用同一个对象的方式,那的确都约定好用Instanse就行了。
    至于是否提供公开的构造函数,不是必须的,但如果希望从来都只存在一个,那就不要提供公开构造函数了。最近还在看设计模式…
    还没看完,不知道有没有模式是类似这种。
    public class Context
    {
        public Context(){}
        public static Context CurrentContext{get;set;}
    }这样配置信息就是CurrentContext,但提供公开构造函数,方便“复位”上下文环境。
    Context.CurrentContext = new Context();
      

  5.   


        public class Manager
        {
            public static Manager GetInstance = new Manager();
            private Manager()
            {
            }
        }