首页 > 代码库 > 单件模式

单件模式

有时候我们只需要某类一个对象,多个对象会产生不利的影响,如充当打印机:

    public class OnlyModle
    {
        private static OnlyModle _only;
        private OnlyModle() { }
        public static OnlyModle GetInstance()
        {
            if (_only == null)
            {
                _only=new OnlyModle();
            }
            return _only;
            //Console.WriteLine("display get");
            //return new OnlyModle();         
            //return null;
        }
    }

这时候我们只需调用OnlyModle.GetInstance()就能得到唯一的对象

 

example:当我们需要牛奶时,最好需要一个没有水和奶的杯子,如果有就溢出了;且杯子有水和奶时我们才想喝,不能没水或者没奶时就不叫牛奶了。

    [System.Runtime.Remoting.Contexts.Synchronization]
    public class Cup : ContextBoundObject //这个是防止使用多线程时可能产生的错误
    {
        private bool _water;
        private bool _milk;
        private static Cup _cup;
        private Cup()
        {
            _water = false;
            _milk = false;
        }

        public static  Cup GetInstance()
        {
            if (_cup == null)
            {
                return new Cup();
            }
            return _cup;
        }
        public void Add()
        {
            if (!HasWater()||!HasMilk())
            {
                _water = true;
                _milk = true;
                //Console.WriteLine("1111");
            }
        }

        public void Drink()
        {
            if (HasMilk() && HasWater())
            {
                _milk = false;
                _water = false;
            }
        }

        public bool HasWater()
        {
            return _water;
        }

        public bool HasMilk()
        {
            return _milk;
        }
    }

我们看看效果:

            OnlyModle a=OnlyModle.GetInstance();
            Cup aaa = Cup.GetInstance();
            aaa.Add();
            Console.WriteLine(aaa.HasWater());
            Cup bbb=Cup.GetInstance();
            //bbb.Add();
           // bbb.Add();
            Console.WriteLine(bbb.HasWater());
            // Console.WriteLine("my test");
            Console.ReadLine();

结果为Ture

         False