SingleTon 要求一个类有且仅有一个实例,并提供一个全局的访问点.

ContractedBlock.gif ExpandedBlockStart.gif SingleTon类
 1None.gifusing System;
 2None.gifusing System.Collections.Generic;
 3None.gifusing System.Text;
 4None.gif
 5None.gifnamespace Gof.Nan.Test
 6ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 7InBlock.gif    public class SingleTon
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif        private static SingleTon _singleTon;
10InBlock.gif        private SingleTon()
11ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{ }
12InBlock.gif        public static SingleTon CreateInstance()
13ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
14InBlock.gif            if (_singleTon == null)
15ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
16InBlock.gif                _singleTon = new SingleTon();
17ExpandedSubBlockEnd.gif            }

18InBlock.gif            return _singleTon;
19ExpandedSubBlockEnd.gif        }

20ExpandedSubBlockEnd.gif    }

21ExpandedBlockEnd.gif}
ContractedBlock.gif ExpandedBlockStart.gif 测试代码
1None.gif        Gof.Nan.Test.SingleTon s1, s2;
2None.gif        s1 = Gof.Nan.Test.SingleTon.CreateInstance();
3None.gif        s2 = Gof.Nan.Test.SingleTon.CreateInstance();
4None.gif        if (s1.Equals(s2))
5ExpandedBlockStart.gifContractedBlock.gif        dot.gif{
6InBlock.gif            Response.Write("s1 is s2");
7ExpandedBlockEnd.gif        }

一个特定的对象承担了其个职责,而其它的对象必需依赖这个职责.当然这里我们用了(Lazy Initialization)来保证在第一次使用时再创建实例.
为什么要对SingleTon进行惰性初始化:
1.我们可能没有足够的信息,所以无法在某个特定的时刻实例化一个SingleTon.例如,为了创建一个Factory SingleTon,我们可能必须等待,直到实际工厂中的机器之间都建起了通信渠道.
2.如果某个SingleTon对象需要一些资源,例如,一个数据库连接,那么,我们可以使用惰性初始化.另外,如果在一个会话过程中,这个应用程序不需要使用这个SingleTon,那么我们也需要使用惰性初始化.
在多线程环境中进行惰性初始化时,必须防止多线程对SingleTon进行多次初始化.

ContractedBlock.gif ExpandedBlockStart.gif 支持多线程的SingleTon
 1None.gifusing System;
 2None.gifusing System.Collections.Generic;
 3None.gifusing System.Text;
 4None.gif
 5None.gifnamespace Gof.Nan.Test
 6ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 7InBlock.gif    class SingleTonInMultiThread
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif        private static SingleTonInMultiThread _singleTon;
10InBlock.gif        private static object _classLock = typeof(SingleTon);
11InBlock.gif        private long _wipMoves;//私有变量,表示一定的意义.
12ExpandedSubBlockStart.gifContractedSubBlock.gif        private SingleTonInMultiThread()dot.gif{
13InBlock.gif            _wipMoves = 0;
14ExpandedSubBlockEnd.gif        }

15InBlock.gif        public SingleTonInMultiThread CreateInstance()
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
17InBlock.gif            lock (_classLock)
18ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
19InBlock.gif                if (_singleTon == null)
20ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
21InBlock.gif                    _singleTon = new SingleTonInMultiThread();
22ExpandedSubBlockEnd.gif                }

23InBlock.gif                return _singleTon;
24ExpandedSubBlockEnd.gif            }

25ExpandedSubBlockEnd.gif        }

26InBlock.gif        public void DoSomething()
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
28InBlock.gif            lock (_classLock)//保证其在执行时的线程安全性
29ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
30InBlock.gif                _wipMoves++;
31ExpandedSubBlockEnd.gif            }

32ExpandedSubBlockEnd.gif        }

33ExpandedSubBlockEnd.gif    }

34ExpandedBlockEnd.gif}

The Singleton Pattern ensures a class has oly one instance, and provides a global point of access to it.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值