前言
设计模式目录:
- 小菜学习设计模式(一)—模板方法(Template)模式
- 小菜学习设计模式(二)—单例(Singleton)模式
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
- 小菜学习设计模式(四)—原型(Prototype)模式
- 小菜学习设计模式(五)—控制反转(Ioc)
- 持续更新中。。。
本篇目录:
单例模式(Singleton)可以说是最简单的模式,对.net来说,因为不需要考虑到垃圾回收机制,实现起来很简单,但是对于没有提供内存管理的平台来说,比如C++,因为单例模式只考虑创建对象,所以使用的时候要考虑全面些。
其实说到些设计模式,我们有时候用到的真的很少,就像飞机零部件的模具不适用于汽车制造一样,某些设计模式也只在特定的环境下使用,单例模式的使用场景一般是资源管理器等,像说的最多的就是打印机场景:每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。说白点就是一个男人可以有很多女朋友,但是结婚生子的只能是其中一个。一夫多妻的情况就不是单例模式了,那应该是“多态”了。哈哈。
简单实现
单例模式(Singleton)在.net中的定义是:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
从定义中我们可以看出,单例模式所具有的三个要点:
- 某个类只能有一个实例
- 必须自行创建这个实例
- 必须自行向整个系统提供这个实例
根据所说的要点,我们可以在.net中这样简单的实现:
public class SingletonTest
{
public static SingletonTest model;
private SingletonTest()
{ }
public static SingletonTest getSingleton()
{
if (model==null)
{
model = new SingletonTest();
}
return model;
}
}
代码就这么简单,在getSingleton()方法返回实例的时候要先判断对象是否已经被实例化,如果是就不需要重新创建了。
线程安全
上面的代码看起来没什么问题,但是在多线程的情况下就会出现问题,我们来开几个线程测试下:
public class SingletonTest
{
public static SingletonTest model;
private SingletonTest()
{ }
public static SingletonTest getSingleton()
{
if (model==null)
{
Console.WriteLine(String.Format("我是被线程:{0}创建的!", Thread.CurrentThread.Name));
model = new SingletonTest();
}
return model;
}
}
class Program
{
static void Main(string[] args)
{
Program p1 = new Program();
p1.Test();
Console.ReadLine();
} private void Test()
{
Thread newThread;
ThreadStart ts = new ThreadStart(DoWork);
for (int counter = ; counter < ; counter++)
{
newThread = new Thread(ts);
newThread.Name = "蟋蟀" + counter;
newThread.Start();
}
} protected void DoWork()
{
//调用返回对象方法
SingletonTest.getSingleton();
}
}
执行结果:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqUAAAD4CAIAAABaNQhlAAAgAElEQVR4nO29aXQcZYKuGX9nzsyZuXd67vQ5XQ3NvhVFAYehKE8X5dNcsAFvCBm7DHTXYgMFt25XAWUbQxVGNsLYMhhswLbEYsvYWmxJdsqWrX231lRKqSVTUmYq933RmloiPD9iydhzkURW2e9z3qOTioyM+CIyI57v+2Ijvv322/379//f//ijo3nfuYLTOku41ehvHQ60GAMtxmCLMdBi8DcP+ZuHfE1smod8zUN+UZqGfE1D3qZBb9OAt2nQ0zToaRrythj9V0dC7aZIp3mi0zLRaZmk0zU21W2d7rZOa20zWvuszjGrc873uub7XAu9roU+N9nnJvvclN5N6T1UX2pxx9KbTHSycVE6F9UjF60oTkrrpLqF6RKm08EP2cHFTrazaePHRl5l00rHSrZayRY2zWyaxmJp5GIhGy1kAy/1dMxkvZmsE6aWi0kxNVxGBalWTpVSRuRTiSB/z1H6YSttCCrbjmgr47Y+lS2U24pFWze9ydObP3+HQO8iuD0GfzfSZCWbrGTTGNksipVs5u2CWq3srslGtvL2V2222H6s3U622ykuHQ5BhHtFqstBBaao517cFpyatwdn4yckE4ckgcn5/Z9+MRElpW+lluDk/JHXfu0fMljOl1rOl9oulNo1pXZNqUtT6taUujUlfk2JX1MS1JSENSVhzdlxzdkJzdlJ5UxI/h3XnA1rzobLS0LlJcHyEn95ia+8xF1e4i4vdZaX2stL7eWlNk2p5UKpV9ez+b//MjRD6T2U3kONBCj/FJX73ff/zz/d/Oabb37yySfE/v37b77j3i+PfzNkC9b1Oer7HPV9zvo+Z73eVa931eud9X2Oul5Hrc7OpNde22uv63VwI9f1Oev7nA16Z0O/q6Hf2aB3NehdDXpn04CrZcjbavS3jYQ7TBEm5kinOdJlmei2THaPTWmt0z22qM4+2+ec7XPN613zeveC3rOg95B6D6n3UHpv8vGkGPWqQ0I1g7gVglglgOx2kl28dDpiUasB2AT6j8XKVAIEVYExskW4lTLbsIVs4jZySW1AUCcQpo6LUi1BmBr1mMSpRpDrK9IfufpGUasQ0RbHbYmy26l0c+Zv7PTmT+8K+DuHFonIm60CuzfzhkhHFlmfv3fit17aeeLvsKspPznfKyjfvvy+P7ztP/wDg5ZzRXSs54rsJUX2kgJXSYG7pMBbUuAvLfCXFoRKC8KlBeHSgvEkE2YTKivwlxX4ygq8pQXu0gJnaYG9tMBWUmQtKbKUFFlKitxdXRv/7ZehGYG/7BEq99tTd/z44TfffJN4/fXXb7vrPpsnUtllruo2V3Vbqnmp6rZUdZsrO81XOkevdI5e6TRVdpqreGPWaMdqeqy1Omttr72u117f52jos9f32Rv6HE39rpZBz1Wjr30k0DEa6hgNdY6GOk2hLnOo2xzRWsZ7xiZ7bFM6+3SfM6p3zuld8/3u+QH3/IBnYdBLDnrJQS816Esy3lgGkkm/bDxMEqkcxOktiPUQkKJonbF08yKoDdDh1QbauYg6AxSqBbIdA6LuAUGdYEytt0ClohA/ZvnUI8j1GKUffArbjmjrk2+RjwldbhVbOeZmq4ybBbsLm3h3wd9XMM0JycSTsn6H0Poyvp9M2PcJNPQDk/MfHTy8tL7/7DdbvPr+kTOnRs6cMp85ZTlzylp4ylZ4yl54ylV4yl2U7y3K9xfl+4vyQ8X54eL8cPHJceWEi09GhP+Gi/NDxfnBonx/Ub6vON9dnO8uzncVnbIXnbIVnbIWnLIUnDIXnBopOOVua8tc+f+JfN/nofxT1D33P5SRkUEQBPH5l8ebe8cq2owV7cOXO0bYDFe0D1e0DVe0GS9dNVxqHbrUOnTpqqGizciM2T5S2Tla1WWu6rbUaMdqdbb6XltDn6Ohz9Gotzf2O5r7na2D7jajt3PE3zUa7BoNdpsC3aag1hzSWsI9Y5Fe60SfbbLPMa13Rgdcs4OeuUHP/JB3YchLGnx0KIM/mfhiGVp8vNSQV1CBUKlJSOsKoi4HdtWTgrjJXjY6XgS1ATpO+WqBep1AUDOwy0SlfiC75ct0ISSVMcWIewsR5DqKyi8/he1ItCXKylXQoy7uVJfEQbZzuws72W5nehbb7ORV9nhiq41ssZKtNrLFxgies37zmJz1E+reV2vo0773T8xZfDMW34zFL8hYkrH6Z6z+Gd/47IcHPg9PzVnZIVwOHv4uY+M2lRw88p01MCOKb3z2s5cz3T26oRN5xhN5IyfyRk7mmU/mWU7mWfPz7Pl59vw8d36eOz/Pl5/nz88N5ueG8nPD+bnh/NzD23dxEz+8fZfskHB+bjA/15+f68/P8+bnufPzXPl59lN59lN51lN5lvw8U37eSH7eyMk848k8e3Nzxi8ek/p+OEAd++bUww8/TPzTLXc6fBFO55fajKzgDZdahy62DpW3DJa3DGiaB8qbB8pbBi6yY15uH77SMVLZaaruNtdqx+p7bY19Dlrzzf2OlgFn66CrzeDuGPZ2j/q7TQGtOag1BXvMQZ0l2DsW1lsjevtEv2NywDk96JoxeGaN3jmjd97oWxj2k8MBcoQJlWyGk4xRNn7FiCoZ0oqCcpcDOcCmnxc9F48g0jqBoFrgikWmfuAitS6ym46kZhCLg0mnJB3Cwwr8yO8yUopMzwSCXL9Zwm1HtFXyN1jp5sxt6bL7Aab9wN9XcPsBO9nuYArPWb/FJm7rNylZP15bn39QX3REn/a9JxIddk3SGXHHz6hqPOFo1seHQpNz0rcyNm67pkrGxm0mz6Qonkj00Kb1rs7OgeNHBo8fGTp+ZOj4kZHcIyO5R8y5Ryy5R2y5R+y5R5y5R9y5h725h325h/25n9PhzzFj47bP3twhGsKOedibe9ide9iVe9iee8See8Sae8SSd8SUd2Qk78hw7pGh3CNDuUcGc4/Y6us2PPaI1Pd6DxWaoe748cPEP91yZ3hyprxlkBM53ZrnTF/eMqBp7tc09Wua+8tbBi62Dl5sHapoM1xuH6nsGK3qMtX0WOp01ga9vbnf1TLobh10XR10XR3iZO/rMQV05mCvJdhrCfZZQnprSG+LDNjHBxwTg85Jg3va6JkZ9s4Oe+dGfPOjgQVTYMEUIE1BikkoXoIpZlQpAWo0pZqEqNKg1AkhWzmIe6BB9uwE/kkG8c86dFM9/Miebyh3+iGXboV0qcShmE4EufGiskWobEdKm55oC1XfnJmTing7AZkTk5k9A6l1CdwvsD7bw5eI8luUlG8T1YHE1vdPURte3OYITPZZAlz0loB+LE76lWPzTfzlwxxveFr6ViK+H7AGRLH5Jw5seMrW2tJ9cF/PwX26T/b1frKv/9N9A59+NPTpR8ZPs0cPZZsOZY8dyrYeynYcynYeynYe2us+tNd9aO+h//knkeD5rw/9zz+5D+11HdrrPJTtOJRtPZRtPZRtOZRtOpQ9cijb+Gn20KcfDXz6Uf8n+/o+2df7yb6eg/vMVyrWPvwTqe/7PNT0/LU7fvww8aNb7opMzly6amQ66tsEffgX6bQM8isEl9uNl9mWPS37Rr29ZcB1dcjTbvS2GzwdRm+H0dM17NGO+nTmQO9YUD8W0ltD/bbQgC08ZI8MOcYNzgmDa9Lonhr2TI94o6O+6KhvzhSYNwcWLMEFS4i0hMixEDUWosbCqgnFYkkm5mQiW8NQrC4ExdUF9cqByrEJlZ6DATpK9YOUzk/s5bLIyxl4pyxII3uZA4LcaFHaQFS2qSQuNWK3ZelmHn+3wG3aLoqzfid7+vBVXkOff2VQc7yTBuS79+WsT3fv0763+ia0o15+ehKIjotJEItn/N09BzyhKdFwncnL6Vbak88N7zV5RRnzju9f82/WpsbOj7I6P8rq/iir56Os3o+z9B/v1n+8e+jj3cb9u0f27zYd2G05sNt2YLf9wG77gd1ONp/+j/+U1jMyNm779H/8Jz0CPb7twG7Lgd2WA7tHDuwe2b/buH/30Me79R/v7tu/u3dfVs++rO59WZ37skYulT/70/vUfP/Pt94dmYpe6aBPxxut7DRd6TRd6Ri93DFS0T58qrQ693QZl7zTZXmnL3xdcOGbggvfFGi+Kyz/rqj8RPGlk2crzl1ubjN4ukYCXaP+rhGfdtTXY/L3mgN6a2jAFh60h4ccEYMjYnRGjK6JYdfEiHtyxDM16p02eWdMvqjZP2sJzFkC82PBeWuItIZJa5i0hSlbmLJFlBOOxbpEEdUnLNIkU3XgVxHiVgukVQTZ4wuy5ysYVA4oSA4uJHq6omqW4xIJBEGYKG9fKWyt0k2eOcgo2UXQewM92wCgm/tal0D5bXbG3C3cSb5W5qxe6amCcbv3lQ7q0763eCKdRrc0XUZ313CcdEticoV3ZX3sCk5K38rYuC0cDofD4YyN25SGa4fd2hFBzO7wx6sfH2uoa8t6ry3rvY6s97qy3tPufU+3d1fv3l0De3cNfbjL+OGukexdpuxdY9m7rNm7rNm77Lx88vofuFnQc/nk9T9w79Ljj2XvMmXvMmXvMmbvMn64a+jDXQN7d/Xu3aXbu0ub9V531nudWe+1Z703fKHsmZ/creb7m26/d3x6trrHWsNLdY+1WjtW1W0pLrnQ2dPf2aOXpL9L19+l6z9/ueF8Rf35ivrvC8/Vdo9qzSGdJaSzBHstQf0YbfpI2fsEQRDE7rN5a4inT42MuCc0HxDEB60mz5TJO23yzph9M2Z/1OKPWgJzY8F5a2jeGlqwhRdstPLjmT6pLMb98bsQgpSZCcmPSTYBcpQX9nwF7S6C2FVPDgfY+GMx8mLwk2V7CGKP1uAnmfhIg48cikW7kyB21pFDPnLISw4xlzwkmgHl9KvEs1w59wFBfKBdvunLRbudILbX/F0UlYvjq7XEU987kv1g/feZxFpN/fKXUGHlpLiqE02f5iki86u+5V//Kc5I+VtT3tZUttCktnR658Dbb7DW91B6tq3f42Ya+p3sCX1X7WSrTXjbD0vsQh6R9ZM/ok8yvt+yrdPgKKzpleb3f/xA/fS61//4QXFt71k6dUyu6sdeefMvQ2Ne+t9zvGRs3OZ2u91ud8bGbfGH1zNp6x9799b/q+/UyaLVj59d/fi5px8ve/pxzdOPX3z6F1ee/UX1s/9a/+yK5jUrWtauaF+7onvtip61K3qFyc7I4GZBzyU7I4M/gm7tiu61KzrXrmhfu6Jl7YqGNSvqnl1R/ey/Xnn2Fxef/sWFpx8ve/rxkqcfP7f68fZPD6z4h/9Nzfc33/njiZm5hn63MK56vau+z1ld1xidnZ2Jxkl0draypr6qw9hnHe+zjett4/22yIB9fMgxYaz+iCD2aTxTox7T12uJp0+bzN7pi1kEkdVm9s2YufMtA7NjgVlrcM4anLeF521h0k4nQtkjzhMbiGeLnfYIRedKNkFka7l/u4sziQ3l3fS/zQcJDt44dJi6QvNBgjh42Vj+LJF5wsirDTQdJIiDlxOrFqhWBUgu5iBpbsghiJyLrPsv7iUIIqdc4n5W/4zvhZUAGfcP+8kLewhij9YorAdwtQGDn/E9e7GDOENyGUwtynuThtOZxFpNg16ziuCTU6K6w5KmJIsgsrRJfSSh6DWriMyv9OSAV7udKx0zI+12gthem/Q0l6uosXAFc3y1li3zWk2Dlxmy6rQj2WkyX9MylpkpmMLKSXhV1+YQRE4J/8siCIL5BhP5lpciTBnoyTIw6zzFGTErR03MKW2YsU27X7gBrtM0+bQ7mRfMDqEsiyCInFIfWZolWLlvV9Md+xTXsd9uZ07ab+H5PnaxrvASwZStT/u+fdD+fWXP91WCnK7qSeRwe0F1D51CNs195q1/fG/A4inkDaSTsXGbzWaz2WzSqgM3vKi6J5aanqKantY+8zs3/x+9J74982+PFf3bY8VPPFbyxGPnn3hM88TPKp78WeWTj9Y++UjjU480rXrk6qpHOlc90r3qkR5esjds4KbPkbFxW/aGDdw42lWPdK56pH3VI1dXPdK06pG6px6pefKRyicfrXjyZ5onflb6xGPnnnis+InHip547GrOvsf+y/+i5vtb7vrJZHSh1Rjkh7mznjFQ39A8ZLR9lFez75vqj7+r2p9fmXP6ysCAKRjwW8fGrGNjgYD/WFnHsbKOypr62q7RAcf0gGNq0Dk15Jw0uKaM7unW7zOItWXt/qjZN2P2zVj80TF/tGIPQexpHwtExwLRscCslU5wzhaas4Xm7eF5e4Sk44hQjpaDBHGwcpxy0DGWryEyTxopB2Nx7V8J4q/NrPiJzBPGWLWAHi4MW3tgfS+uB8h1J8Rxf+wcApIfS4i0hBzfrieeKXSYQ6Q5RJqHNM8QBEEQzxQ6ZNv9o0HtLoLY1SDb9BdEtgYwLC9+aRzH1xGrTzvi6l+mq0AUr2IGveSgV7uDIHbUkoN6zSoi86ie3XnV5tC7yMRbIaVZBJGlTWRgUmGnoN3BK09pFq+oqU9TYYTaHILIKV1EmVk3O46ujc2o4XTmjtrFT1NhBNHXl0LYpV7cV+Y4yniR/V3Fiqc62cWXX1oGvWZVrAyOo2sX851yy0UOym1KjaczibWaRq/6RqoYg4809GtWE5nH+0mDj7cfqM8hCGJnPWnwC0YoZepkTMc+fSyf8z19wQ594h7dn99kjd2cg7lPgOTGAClcs+efIjds2do+aP++Uvd9pe50lSAZG7cFVcnYuK2gWselsFpXWK1r6bNs+xPtex2XompdUbUuY+M2kyoZG7cVVeuK+anRtfZZ3rn5/+w9+W3hEyuKnlhx9skVJU+uOP/UCs1TP69Y9fPKVT+rXf1o49OPNj/9aNszj3Y+82j3M4/2sMl+7jn+TEWvs597jh5N+8yjnc882vHMo1effrTp6UfrVj9as+rRylU/q1j1c81TPy97akXJkyvOPrmi+IkVbQf3PfZf/1c13996zwNTs2SHeYKfdvNEu2mi3TReV99oGHa+evD8a5+VvfHVuT/kFf/xRKFONxz0e/m+z7vUVllTX99jHnJHDe6owR01emZGPNFRX7TtdAaxrqzDPzvGtOBnbcHZy3sJYm+HLThrC87Fwsh+wR5ecERINlRlNkFkaxnZRyhtcSaxoVwboRx0mg8SxMHKiKAeIIrA95zmeb63x/oGJL5P9IgAc87BWFig/LEhzTNE5rdDpCVEmkNke2EmsV5zsTCTWK9pD8l29Qva92rK95MjEtmriF8QH+N7o480KrT+hZUAZd+rpy6HbjEM9WtWEZnH+kVvCYeoht4HJTIwmbDLJS3eIhKnVNw6STGOY+uIVacdqX8pcmk8nUms0zQqjbDo9cOtk0V9ZbFiSJa9X7NKZW0s4ffLTWqx36Psd5rSt8OL4rbM6pze5I0+Zldwfg9BrNM0+x3H1zEHB7nvaMAXO5BPH8XvFp6rT5+oT7fvGy1kw5jk7kBJWl909j7j+wH76Srd6are01W9Z3jJ2LjNrkrGxm2F1b2iNPdZtr3518ExX1FNrygZG7cZVcnYuK24ppfOWTYtesvO2/6h7/Sp4mdXFq9dWbJ2ZenalZp1Ky+tX3ll/cqq9Svr1q9sWr+yZf3Kq8+t7Hzul90Zv+zJeJwOf44ZG7dlZ2aKhtCjaTN+2Znxy/bnVl59bmXT+pUN61fWrl9ZtX5lxfqVF9ev1KxbWbp2ZcnalcVrV3Z8nvPYP/zvar6/7d4Hp2apbmtUmJku60yXdeZKVa1h2Pneicu//6r4pc+/3Xzk6Oajh3W64aDfNzY2NjZmCQT8JxoaT3fUVNbUN/SOGbxzRu/8sG9uxDc36pu7uCfWKfSXRtuJ9cSzRTZ7aP7KXoLY22UPzdtD892Fz7OjPH/SsOAI209uINYUO2jfOyPa9wni/RbKGaHjzN9ArCl2ci5nagPSeoC0QhARVhcUfH+F7QNgWF/eFaZsYaqrKJPrPDxhoGxh6vKHBPHhwb8QBEFkfmcgL38Y66yuYH3fUZhJrNd0iNr6Q5pniMxvBmMH+Mv3CjrQ3m1gG/oFmqfpQXu0owPsayJHEyBHAqRmD0Hs0Y4EyJaCTGKdJpdb23u0w35y2K99hyDeqSeH/WTzmVjhj/dr3+F1hB7vJ8/vIYg9Oe+w/xr7NavZt3fW03uK2KKV+UiDz3F8nWAK3A5lZ1YmQRBEljbWQ0i/5jcvmGh3EmwfA28WbK+Ddic3hyytZFIEsS5nZ6wMzGGLptPcYnLToWs2mp3i4aTBRxrqctgl0u7kFZtfwp11MhPhjpLw5pizM0tSVMEImcf7BSUULA4N27nadDqTWKc5niUcU9xQcxxfJ+iP5S2vgy2GhvumYgtel8MVaWdWJj0Feo5N4hGInXWCf9lxeN8OswKZlXmcW0BBwWKHlkSlYhct/qo2CAopPVblOL5OMDXJSs48fjq24PRPkf9NCX6i/E0gKye2jPwy9GtWE+JOMt5EtDsJYudpbjqxH38Z97Wuy9nJfFmC/rbYCEROmeBfdhz+N8KewVO2hyD28L7uMw5BFZ/zvbj2z+0Nci7QPYI+rg+GOS2X873WSXWx9+Rp4919r4l7SIdZ7ub8CXTvy1rfP0Wu37K1c8hZUKM/U02nv4BOTf8bb+1RP37/xlt7imr7i2r7i3lp1VtfffP9QYuvuK5flB0ffK4+wR0ffH62rp/Lubr+c3X9V/utO+/8R31xQckLa0o3rTm/aY1m05pLm9ZUbHq2atOztVueqXtxddOLq1tfXN3x8urOl1d3v7y6h032rzZzE8/+1WbZIT0vr9a+vLrz5dWdL6+++uLqlhdXN764um7L6ppfPVO56dmKTc9e3LRGs2nN+U1rSjet6fzqyIr/9l9C08q+v/2+B6fnqB7HHD9aNrTvM/bnrf7o8zWffLr+yIGMYx/R7fuxMQvdvj/bd6ls8HxlTX1Tn23YvzDsXxj1L5gCC+bggiW40FmYSazXdIUW7GH7ifXEmiK7I7JQmU0Q2d2OyIK2+HliwwVtZIH32sH4fpx0jlM9xZnEhvKeccpJR9S3P1y+hsg8OUw5xoXdAPwIPqJ9nyDebxY29CW+p08I6OK18rt4Q7qKM4n15Z2074nM7wykNUxam3L4mmej/QtBvNfIHs5vzCHotn7Q8c16gtirlR7RbyvMJAji3QbSFNC+SxC02lnT52jYA/xPFzg43w/TvieI1Wccw35yuD6HIDJz+2O+l9vUHcfXxfYI5/cw+yMj09WfU+YnDX6y6UwmQdCvtTtp94t3rLTAcsq4XaS8mWR9z+7j5EYT7Ij5VYd+zWrejl5iVna/HBuNrpqw06/L4SlEeFCD2cXzCymQkEAS9B6fPzXe4nOl4ks09rouR66cghVLVwt4O3ehLWJrhhEbz3xC3wtqQrGvSVCpEvmeXzzuteDr41XUJGuDX4kR1IrY9cAvFa8w8Va12PEy56awa0ZuNKaOyC8Dq1IZ3/Mrf3R5ON8L58t4N1YbEE+EXz+OfbOCX6PI9/wiyf6QhL8H7U6CWH3Gwfie7Zzntlyh73n1Bl5tgG4MvFPPHgEUH78/WOzm2vcU3Z/fzjbu6eP3tNEbeE/hEllf/qC+8tn7tO99U+QLv/1De//Y2QZjUZ2hmJezdYaz9bGck6ZBkBI2bQPOV976wDAWKG0wyKYsybQPON+796aB8yUXfrdZ87vNF3+3ueJ3m6u2ba56ZXPdK5sbXt3U9Oqm1lc3tb++qfP1F3pez+x5I7P3jUy9cvok//a8kdnzRmbn6y90vv7C1d9vanl1U9Orm+pe3VT7yuaqVzZXbtt86XebL/5u88VXX+o++c3j//jfQtNUr1vR9w9Nz1E614JsaN8/s/+ztYcObvhy//O52ZtOfEC377n+/H5Xf7+rv7KmvklvHwmQowHSFGCarWNhsrMok9ig6Qov2HkiZxvljpMbCCE5lRHSMU7SsneOM615WvZSqTONde4t9rViWrgWvJrv7cbyZwmCPhXAFqFs/OY+uw1cZtr3WqYbP6T9C0EQBPGXRp7vG3MIIucSe+7epb0EsV7THiTNQbK9MJM9iU/7Li14tj//XYJ4t1504p4jbx3jeL7m6fP1hv1ky5lMYp2mhenJZzUfe8E0x3kbucT3/PP82X0Hsy/zC3dzYnPzd6kCowt2Ugrt+511wiYvZy/JnrQsiyDWZa4W7uV5O0fxGQnsW6LhvH9lisQWRtyIFE6EtaCoUlImbt/ze0GI2OLwhCpYRby3hMPjeE64ruTNwS2saI7cv9yLsixRmTOP9wvXVV2OvOEEw/lrTNJ4lVlpcVa1ZL7y7fvVpx2Cti/tNlGd0qdQrZRfEJUy8BaBkPZjCUrIrl6lXyP3gt9xQnA/RXGFibcCY18cfyvmiuEnDerte7rKtS6TIHLOi9r3Pt7xexfj+04nc3NurjO/mdeZX2/hPYhPoaGvbn2+8n1T5O/++F5Lj/FS+9j5FrMoF+i0MtEIU66QLoP39e0fjtgj9L8Xr8rkUjLpNnrfe+AOY8WlK396rfJPr1W9+VrVm6/VvfVqw1uvNr31asufX2nf8Urnjle0O7b2vLO1b9dW/a6t+ne3DipnQPKv/t2t+l1be97Z2vPO1u4dr3TueKV9xystf36l6a1X6956te6tV+mZ1r77dmfx2XV33Ur7no7Y93f8+KHpuWu9wpu2cqF9v+5wTsbRfRu/3rv55O6Xzryr0w0HeMfvZ6Mzs9EZ2vfDfnI0QJmClDlIWULUWIjqLMqku8TtEedJWt4RqiqbILK1zogjn9d1z4XtuqecxvI1RGa+kXIyvfFM65ztq2cmyOu3lz9+z0V4Yn/sRD/mPH+2qMyhegNt/YOXw84T64lni5w24dF6xveSBj3BHrC/tJcg9mrpI/fmoPY9Qsy7DazgG8jRIDka5GueeTESIEeEvr+QtO9jjid4NQDO94I9RRhXnlYAACAASURBVH0OwbYYDPWC7u4kfS9tPQvlKu82OZMJPSQn9VR8rzxfrv26BL4X9/cu0vdyvuGWSzTT1H0vPq6xON8Lv/qUfS/t2BD4XsnWsj+/VH0vv3J8vP6MpfC99JqahHxPD5fzPX+I0PfMYXumV3+P1sA72YJ/vl4Pc34+xR28b+UdvKcfglUv+/jdeNZXOXvfFqFycouycr7oGQ1W97gudzkrOh2iXO50XO5ickUp3bH0moL/uetjs3uysttBp2px6TMHd/+/947UVNf9ZXvdX7c3/PXtpvffbnn/7asfvN3xwdudWW/37Hm7d89b+g/fGsh+a+ijN4c+enP4oz+OJJOhj/449NGbA9lv6rPf6tvzVs+et3r2vN2Z9XbHB29fff/tpvffbsra2fpxVt/p/IKjeVkvbuH7nlM+5/uHp+evKT3ejfb988ezX/gua8upv/574Tu/OfdnnW7Y72N97/dPTk6EQ6HKmvrmfsdIgBoNUqYgZQ5RlhBlpQ97byjvYg+Kryl2xprp9NF0TtLNB9cUO/kW50YTH3qXOzBPf1Dm/HxBq13QoL+cTcRO0Atr/0owUu8qOkgfobcayp8lMr8zUJ1FmQSR+Z2BsoYpa1POs0WOsTBZ8SFB7NVyTXm23177HkG810gyB+mHaNnTHfWZXw9yF+A58tYRxDrNVbq9vk5zNUCOBMjWgkyC0Tx7Ib6fHPY7ctex3fX+mObPs9fjNZ/JJNZpmnkH5N6pI40+5oWhX7NT3NJyHOedH8Q/hYp/ZlApe32O8PQox7F1BDdO4+lM+TPyRGczCd9tPJ1JcBPs16wiuMJod67TNPrI0iz2s+x0mEL2M2diy5ecm0Xs7C3HsXXcUvDHEZ7w1a9ZFTsfinuLeyE8nYpbNP4ph7yCcaUSFKkuh5kCf80Ilt1xbB3vgzLlEZ3Vpd0ZW8PcW7FxBGfGcetfcF4b05/fyJ8je5CC+RQ9BcHXx3R3x76C2Ael5RGfoFeaRfDXCZHgqhafcCf8+uqYyz0kxXMcW8d9nD+Qt9RsmXkF0+4UfSlKv3D51SvzA+NWL3+OvGILVxfv50pPQfB74H9BvKLKf91yK1BQVxB0XWQe7yeH6GsoPtBKTtYTH7xvZu+x02BhHopdZ5J5eq9K936jakO/10MOWDzP//trf/nos6s6g9k7M+KeHvXwMyONSTbeWHZkfRqanDd7Z5YqH//rT73GkZFLGtMljfnSBUvFBUvFBWvFBVvFBfuVC/YrF9xVZe6qMm9Vma+qzFdV5k8+vqoyb1UZPR1XZZn9ygV7xQVbBTMvS9XlTs2F/M+PrLn/HqPVOxoQe1zo+7lrSjdlvFJd16sf/bikcH/ZmZwLpz4pP3no0nft7b2c7/0+33gkHAgEKmvqm/Vi34+FqY4i7si3xPdcPzwN0xvP+Z53rD2Bq/Bj1+KzMCOzZ913SY7Kizrqny1yss13pnOeGRiixkJUBXdKHXv+naD5HnJ8s54dYa+WEfx6TRvTS+/IW08Qe7WjQd5Z9/U5BJGZN8ConWFPDnuSXexsu2GF7neuXd50JpNYp2li7rrDNRFie5zYATmBp5kdnGBP4Y31KK5am0lfQ8XsAgiCvZBMuyO22tjLkISXPIkvu5Jcfy+4eKk2diIVMwXe+PQlT7EJMm/llPI+GBtH+CnmSqesHNHUZC6Ki5WBuzKKu+hLcLkU/7O8OebsYEvIX/bYCLGr3di1R4/Dmy//4jrR+DLXNIrWKvPZWFEFXwHvsw28Uwh3ZDEz4s+RNwK3ihxH1/KWgj9frpyCVapw4RxTqhzu95PgqpZcLsj/BfJ+NpLVwsxar1lFL6x4uWLTWZWVE1u9vC9lR5ZSGfgrSjCjo3pStOC8z7JrkiCItTk7mIXlLzVvBMHXF1td/PmuOu0Y4rbQLC1zCZ9es4rIPKYX+Z5PTqmgksSr2dA3kODx3085e9jGfYed17jnZM/6vtZE1pjIWon11Q/qq1i/yxY1eScPn7r4yp+z1m/ZKsqGLVs3bNkWy4uxPKecjC2/e35J8+u7frT+diYb7vjRhjv/OePOmzLuuvn5u2/OvOdfMu+7deN9t73w49teuP+OTT+541c/ufNXD9z1qwfu+tUDd2954O5fcfkp82Kz8N9ND9y96YG7X3jgro0/uSvz/juf//EdGffd9tx9t22459b1d9+y9q5/WXPnTWvuvGnrw/d89ustNv/UoHtWVuXTcwn4vqKydn5+bjwSHA8Hx8PBifHxifHwRCQ0Mz0VnZmenJyIRCKhUDAUClbW1DfpHcMBila+mVZ+mBoLU1bePfIkV8Mrp5l3rF2mdS7ujY93z11pn3xC99JRvIuOJMLL6hxfryOeLnCoXFYnvXpe+c45sdvnSSN7Wc7S3jNnETeESXvk7z+zDLfEcXy1dnlvs7Mct8QpySKW9zY73K1pFr1uU7iJ0JKtdiKnZFnKoN1OLNk01a7vT2YnMOAlY7fUdbN32nFRnXRnPnfknr3gvt5M1lnIWjNZw/q+Jp71G5I5la/XTToipG9KHL8glDQBaabjJPi3kVCqGQ0qPk8hId+fLr5QWVMvTXVdY21Dc3VtAzfkVGFJ04Bz2M/4fjRImULyyk/sfvgxPdOhD5Zz/3YJj7XHvzkue+886bN2Erg5LpX4nXEZndfn0KfTq98WV3wbHCV/e5O4Ia7S7uCHvAnuD3Zz1hTvVLpUd1ft0zzFLWZNDrGsd4RdsjvOarcTOedi6yGVm+8uauWnkJocgivzDxHHV2u5n4d2O0EQH2iXrAw1OdzthOu/zyR+mLv80kng1rz9HjJ283w3/zI8qkN4G136sD2t8FoTWWsia8wx2ceUb5Lr3jen0r2vcj8+weP1hM/VlXkyoepTB5WeMZj6k5DUHyq2+AcjJZaEfN9hmarpdVbrHPzU6Bw1vY6aXkdtr6Ou11Hf56jvczT2O3tsUwY/NeynuFY+17HPWd/6Qz38RvZheqk99kbtgTfBBJ52I33UTeLPuVn0421u+KfaOL9cSzz1vXOZpl/3faxn9c81aV/YxFITu+f08q2Zv+/0lT/FraMPtEs78bMfxA5DfNmXjqVT3ScITO+iupxUp4PqEN5Al2nZ0934JrLGRFabyJpRsnqUrDYxiW991Wv2ZJ+4o34/vqVSfvf1qPyEfK+UPnfsuYr93NOWfNSQjzLQbgtQwwFqJBizPl/8Ko+1TeqZtkk91tYU92l1iT3Klv/MOvVn28s8wVaqbY/as2sVH1mbwHeUwpNq8bxaBLluor6Zy+4Zenin4nOmF1xtz940t97CdNdzvq8eJasUlC9r/US69xNs6Lel0NBffuX3/C0pf1G+Fyvfw9hrwCewPi3IEZ74xQ+SZ58ln0ISsbXK4+dl/K2gcJkmuHKbW7b1TD9Sui+ejHu4yP3UmDhjkf2ZdjsFP2VxHIrpRBDkeozKVi/dRXQ6qQ4HRV9k38YzPXcqfoM51qyvYdVOy56LmvXjHdRX6t5XuTMPo/ylbuhfT337i/W9SPl0NxHzoGWe9fnN/WHlx73HtbKapOV6zmWeFq/e/vbyI3PYW8/FE0sfHfZ2BTo6rlh62GjZdNNxkl3SOJjbU4vS4WCeUcFP+9KlDUGQ6z0J7gqu0o63kS28x9818m6nE2vTj8Y0Xyn0fcz6owlbP273fgI33pc29DuE1pepCd0YfftL4HtO+b1sbzNnfbqtP8DadMhHDSk0nUUN6BTjFQlb/si34oHtWId5TOF9vPsOcSIX+9vJpJsN39+dTp6t6UtXHcquFZ6HQqeVvUk1l5ZkM6aYZgRBbryo7RNowXOOH2M0TFu51izoumcyQlbSUbF+Mgf149ycR/l+fKKGfrvI+ovp25ez/t+X8pfG97Fy8KwvEj/X6OfXAJSUrB75s9ISOPItLTb/SDb7rbA6d8qIvJtvcaeg5d3OilxcpxaZWyLsZvaGlM28y1FiD5PmnidtiT1oMomYFVOPIMiNHbU9A++S+hozWWOOCbuK16CnNX+F872y9dUa+tKD+kmex5fgEf04DX3nD9u3n5LyF2P9JfC9fDmE4u+TnhSa6mml0pPX6OPi6gWTnoDGPxbO+0ZZnct1pIub46KGuLT9zatNN42RTRayyaIo73ph6tiNjUutQmqUYlJMNYIgCBuZvcSo4Ez7KhNr91GycpS8IjQ9Pz+09eM19ONerZds3/7f9eH8xfo+oQJ5YunjnbYmOnktxdkprFD+N6F2Ilvsm2bVLtfNLu5dl2udCxrlUpGb5eRtkgl/e4ttdXKRdppxfWuyqUQQBFGO4r5ilLxCZ4S8MkJeZnNFIaLPJmd9uYP6ce/Mk8gR/QT79juv3779+L53T1C+SZl4FxfZaapHZjoT8vEkFvc4F5KOSxJnRDEOSewR0h4WxKaSEGmNl7GkElSMBUEQJLGo7TFCSSTuLssaIumnjslGvMOkd7DCSHfCsSeujYvD27FTdNwTCUVRIpPiLFKLS2VS90RKvndPUF+fKXvpjXcQBEEQBPnbz9dnymSVH8f3vknqpTfeIYTU1dXJvpZSp4zsyCrTSXA4PSSFSS0e9ZlKlzrZlbCYuS/m47LvLt9qBAAAwBGNRm02m8vlCgQCIR7hcJj+yxGJRMbHx71e70tvvOObXArfi9Sl7tcffrioYNJ3ucInWAtJHKnO1Seb7PCk5p7sBJfW96gNAADAkpAG3yvZK65fZRcgWR8kPnF1zfPfXfI262K8Llv5SLwKwtVg1GcknXIic0zqm03kXQAAAAmS5va97L9xRasiFdm34n5QdtYijUnLo7QgSouQCErlV3mhtCpSK4bKqlCaoPQrUBqeyLez+EUAAAAg5W/R97IovavyqQTVpeL4RCYuW4bF+F70N7XhRJKSlh2ovq5EBVBBZeJxfwPwPQAALAk/nO+9k9RLb7yjLgZZT9Ao7fcTGa4kSEK1calkROlH4hY+ceok/lZfPyp/RSURrQRpCZWWl0jA97JD1NenaMqJTx8AAEAKpOZ7b7K+17G+5887Eb/y31XRnuz4hJxU1MeXnYLsjJbJQ0rF5pck7vjqL9SnIztCIgqP+9XILg4hJJEhAAAAUkDJ9xMTE1NTUxMTE0q+l96TR9H3uuR9v8i9vMg3SalIZTTROIspoUrJCTnfJz5c5GZZVSuVX+krUJlIXK8rDVeapvqnAAAApIas78fHx6empu6//36+8qW+1yXie10836vv92VVrYR0suqalL6WFk92HOkcVcqTFCpLpPRCdo7qJVEqXtxVpPKpuGtA5V2V6ae2GgEAAIiQ+p6W/U033fTII49s2bKFU76s73UqvhfdoVfW94lLRfTBuG9Jp6w0r2QlxJ+a7FuypUrQWypFlX0tWwzZaSZSnrjzjfsplcKojAbfAwDAciPyPS37W265ZfXq1Tt37jxw4MCHH35IK1/J95z1Bb6X3pFf5HtZ5ah4UUlFSqjoJEE/qRQy2Ukl7nuV6aiXM9nhKrNQqXMkXh+KW5hklxEAAMBiEPl+amoqMzNz+/bteXl5586du3TpUm1t7cWLF6emptR9r0vc95xs1Btz6s1BEdIFS9z3KkgnomS+RIqUOHHXj+zK4f4qISqw0nyVpi87PKmZyk4z7kAAAACLR7Z9LyVu+z4J33OoSEvpXdm3ZFEaX+mzSn5KpDwJTly9wEqFkf6VzktaeKXyqPhYafykRpAdkuCkkpoaAACApEj5erwl9r2KaKVDkvJ93CnHNaX0U0plWLzvEzc991c0fiLlUZm7+hDZf0VLp74SlKoaCRYAAABAaqTH91JjiYrFHxhXvbJIP67kJKnD1MsjnawScQupXvJECi/9N8G3VD4iuxTSNS+73lTWg0qxE/9aAQAApEba2vdxd+5KDkjQr6KPy04nqTWVuGWXiRRqEktbSBXZL+3EAQAALDnp7M8nklFIgpqPOymlt5QqBClMavGoz1SpcpP4RBYz98V8XPZdmB4AAH4A0nz8nq8udb/+8MNV+gYIyYHzRGohiSPVufpkkx2e1NyTneDS+h61AQAAWBLS4Hsle8X1q+wCJOuDxCeurnn+u0veZl2M12UrH4lXQbgajPqMpFNOZI5JfbOJvAsAACBBotFoR0dHcXHxUSHHjh2j/3IUFhZ2d3cv+/V40uHcwEQ0JvtW3A/KzlqkMWl5lBZEaRESQan8Ki+UVkVqxVBZFUoTlH4FSsMT+XYWvwgAAACkRKPR4uJiu90+zUJfcB8IBHy+gNfr83i8TqfLYhnr6ek9e/Zsqr53LcHz8ZIaTiSsLhXHJzJx2TIsxveiv6kNJxLzrnqx1deVqAAqqEw87m8AvgcAgCUhGo1++eWXnOnHxyfCkUgoFLbZHBaLddRkMRpHdb36xqbWvr7+I18cifnelbjvXTHfq4tB1hM0Svv9RIYrCZJQbVzKTlm2kHELnzh1En+rrx+Vv6KS8IfzlyXu8hLC1SU7guwQ9fUpmnLi0wcAAJACtO+5m+iFw5FgMOT3B0ZHLQbDyMCgoa9v4GpbZ319c09Pr9j3LmXfxx6c52Ky+Pa9ivZkxyfkpKI+vuwUZGe0TB5SKja/JHHHV3+h9JqQrGTRXGSLJC1egmtM9rtLZAgAAIAU4Hw/OTkZiYzTsvd4fAbjSH//kE6n7+rStbZ21NU1abU6vu85jys/D9cVS7L9+Yvcy4t8k5SKVEYTjbOYEqqUnJDzfeLDpQrn/yuaV4JfgexEEvS60nClaap/CgAAQGqk7HudSyB0ie+Fslfxvfp+X1bVSkgnq65J6Wtp8WTHkc5RpTxJobJESi9k5xi3JLLD464ipUlJ5yidvsq7KtNPbTUCAAAQsRjfi5Qv73udqu8Tl4rog3Hfkk5ZaV7JSog/Ndm3ZEuVoLdUiir7WrYYstNMpDxx5xv3UyqFURkNvgcAgOVmkb7XqfheJ4z0frqJe4hIvrdfRScJ+kmlkMlOKnHfq0xHvZxJTUd9fJU6R+L1obiFSXYZAQAALIbF+56zfnL32yHiNebUm4MipAuWuO9VkE5EyXyJFClx4q4f2ZXD/VWC4K180etEpi87PJGZqk8z7kAAAACLh+/7ycmpyUn6UffjLpfHbndarXaz2drXNyDj+2W6305c5UjfkkVpfKXPKvkpkfIkOHH1AisVRvpXOi9p4ZXKo+JjpfGTGkF2SIKTSmpqAAAAkoLv++npmRU///lvf/ObHdu30zn06aelJSXDw6Zl972KaKVDkvJ93CnHNaX0U0plWLzvEzc991c0fiLlUZm7+hDZf0VLp74SlKoaCRYAAABAaoh8v23r1u++/baMpbq6ur29PRXfx66/Z+Pj+V5qLFGx+APjqlcW6ceVnCR1mHp5pJNVIm4h1UueSOGl/yb4lspHZJdCuuZl15vKelApduJfKwAAgNRIrT/fNym2udz198q+JxLYuSs5IEG/ij4uO52k1lTill0mUqhJLG0hVWS/tBMHAACw5KTWn78EvgcAAADAD0Zq/fnwPQAAAPD3xA/Xny89Xw8AAAAAPwwpn58fx/d9booftO8BAACANCLy/Qe7d5eWlNSwtLa26nQ6pf58kdN5vp+/1uehuPR6qF4P5ZuC7wEAAID0kGJ//hQjcb7Wp+clvu/lBb4HAAAA0kVq99PlfM+3vtj3vfA9AAAA8LfBkvi+V6l9zw98DwAAAKSLlH0vFTp8DwAAAPyNAt8DAAAA1z/L5Xu9hxIFvgcAAADSRcq+lwpd6HsvFQt8DwAAAKQVzvcTExPhcMTvD3i9PrfbMzho7Osb0Gp7Ozq6m1vaamob5H3P03rM9zPz1/q9FBMP1c/zfSKPugEAAADA0kL7fnJykpa9x+N1uTwOh6uvr1+r1XV0dre2tjc0tlTX1Et9T6ucM/uMjO9Z2cP3AAAAQBqJRqNnzpyx2+2RSCQYDPn9fp/P7/X6RkdNRuOIwTg8NGQYGBjS6wfa2jpOnTolat/zlS/0vUcge/geAAAASCPRaLS1tfXMmTNHvjiinlOnTlVWVnK+52zOmV3g+wFvrOFPxw/fAwAAAGkiGo3abDaXyxUIBEI8wuEw/ZcjEomMj4/TvvdPiW0+IN+fL/F9upcXAAAAuBFZKt+L+/MHvBQ/8D0AAACQRhbje5HT1Xw/AN8DAAAA6SNl30uFLvD9oI8a9FEDvMD3AAAAQLpI3fc8ldNyl/E9PwH4HgAAAEgTqfk+MCW2eTzfoz8fAAAASB8pt+8Hvaq+H/JRsXjRvgcAAADSSertey815KX4Whf63k8xQX8+AAAAkG4W2Z8/5KM4swt8b/BTBh9l4FUH4HsAAAAgXaTse87jtNYNYt9zb7AJwvcAAABAmkjN98Epsc0N/P786Pw1o58yCBOYhu8BAACA9JCi76fFNjf6qajI9/wY/FQQvgcAAADSxGJ8L3K6mu+N8D0AAACQPlL2vVToAt8PByg6RjbwPQAAAJAuUvc963HO7ALfjwSoEd57w2jfAwAAAOkjZd8P+2M2p+Uu43t+4HsAAAAgXaTse6nQeb5fuDYSpJiwDX34HgAAAEgXqfk+xPc9a/boAs/3o0FqNEiN8qoDIfgeAAAASBOL9/1ogKLlLud7XkIz8D0AAACQHlL0/YzY5mLfm6S+R/seAAAASBMpt+9FNjfxfT+7cM0UpERB+x4AAABIFym376VCn+X73hyizCHKRCdImYJUGL4HAAAA0kRqvg9zvg9RphBFy13gews7lAt8DwAAAKSLlH0vsrlF5PuxMGWhE2IC3wMAAADpImXfcx6ntT4WlvieH0uYikThewAAACA9pOb7SJRxPD8C31sjlDXMhH4bvgcAAADSRcq+pyXOOd0aEfreFqHoWOnA9wAAAED6SNn3tOOtrNZtSr63RShbGL4HAAAA0slifG8LUzZF34dJLtYwaQ2TkSgJ3wMAAABpIVXfMxLnaz3m+7mFa/YISccWJm0R0hYhx+F7AAAAIE2k5vvxaEzznNnn+L53REhHJPaeHb4HAAAA0kfKvuernJa7wPfOcWYoF/geAAAASBcp+15kc+e4xPexREhHhJyA7wEAAIA0kZrvJ6KkI0I6IyRf6wLfu8ZJLvTb8D0AAACQLlL2PS1xvtZ5vievuSdI14Tg7Un4HgAAAEgTqfl+MipQuWuCdE+QcyTr+3nymnuC5OKaIF0T8D0AAACQNlL3/QSjeS7zfN97JknPBOmZIN0TzIvJWfgeAAAASA8p+n42pnna5p5Joe+9k6SHywTpmSCn4HsAAAAgTaTm+6nZmOY9k6R3kvSKfO+borh4JynvJDU1i/vpAgAAAOkhVd8zEudrXej7SZKOlw3a9wAAAEC6SLl9z3mcM7uofR97gw58DwAAAKSLlH0vsrlvSuh7/xTpmyL9UyT9Ar4HAAAA0siifM8KnY7Y96JMz8H3AAAAQHpIzffTc2Kbi30fmCK5wPcAAABAelmk7/laV/Q9HfgeAAAASBcp+15g82kyMM3z/QJ5LThNBqeZNwLT8D0AAACQThble9bmtNwXpL6PWR++BwAAANLHIn3P17rI95QoM3O43w4AAACQHlLz/cyc2ObBaUrg+9AMRQe+BwAAANLOIn0fmqaCrNkXhPfXo+/AR9+Uh76fLvrzAQAAgPSwiPvriYUeO19veu5ar5uio3NTOjfV46a8k2jfAwAAAOkhNd97J6keVuWc2afnWd9PzF6rs5B1ZrLWTNaayRozWWsmrWG07wEAAID0kJrvrSGyhvV4rZmsM5P1FnJilvX9+Oy1WhNZYyJrTGQ1nVFyLATfAwAAAOkhNd+PhcjqUUbltNZrTeR4zPfRayLZV8H3AAAAQPpI2fdVo2Llj0eFvufLHr4HAAAA0shifC9SvpzvR+F7AAAAIP0sge9H5XwvatzD9wAAAEAaWaTv+U18ie95sq+E7wEAAID0kbLvK0fFyhf6Xij7yhH4HgAAAEgbqft+RKx8ge8FsofvAQAAgLSySN/zlS/je072lSOkBb4HAAAA0kRqvreEGInzla/g+xGycoS8At8DAAAA6SNl318ZiSlf3vec7OF7AAAAIL0sge9Z5Qt8Xyls3MP3AAAAQBpZjO/5TfxKGd/zZA/fAwAAAGlkkb7nKz/m+0j0Gr8nH74HAAAA0suS+X6EjEh9z410Gb4HAAAA0kfKvr88Ila+2PdX4HsAAADgb4Ml8f0Vqe9FsofvAQAAgDSyGN+LlC/v+8vwPQAAAJBuFun7y+q+v8z3fRC+BwAAANJDir4PClSegO+H4XsAAAAgbaTu++F4vr8M3wMAAAB/GyyJ7y9LfS+SPXwPAAAApJFF+V6ofAXfD8P3AAAAQJpZrO+H4XsAAADgb55l9v1wLGb4HgAAAEgTqfneHBSoXMH3vDEqjKQ5SL70OnwPAAAApIGUfV8xLFa+0Pd82bO+fxG+BwAAANLBYnwvUj7j+9vveygyc63CQNK5ZCAvGciLhgVzgNzye/geAAAASAOL9H2FrO/DM9TFwQU65YML5YMLmoF5k39hy2s70728AAAAwI3I0vv+tnsfCs9QF/RzF/Rz59m/ZX2zI775za/sSPfyAgAAADcii/d9hdj39zwYmiJLtNFz2ui5nmhJT/ScNnq2e8bonnth6/Z0Ly8AAABwI7Ikvq/g+/7Wux8MTpKF7VNcCtqmzlydHHLOZv72z+leXgAAAOBGZKl8X8H5/l/u+mlgYuFU4zid/Mbx/MbIyYbIgC2a8eu30728AAAAwI3I0vv+5jse8I8vfFMV/KYq+HVVMI9OZVA/Nr3h5TfTvbwAAADAjcgy+P72B3yR+WOXfEfpXPQdveg7esnXa55a9+Kf0r28AAAAwI3I0vv+ptsf8Ibnv9J4v9B4v7jgofOlxqszwfcAAABAelgu339xwXPkvOfIec/hMs+R854vLnjgewAAACBdLKfvWeUfOe/5UuPtNU+tMF0RYAAAB4lJREFUfwnH7wEAAIA0sCzn63nD81+Ve78s936p8X6p8X5Z7j16yddnwfl6AAAAQHpYFt/7IvPHKvzHKvzHLvmPXvIdq/DnXgnox2ae+/e30r28AAAAwI3IMlx/f+dP/eMLX1cHv2avx/u6OvhtTajfFn0e198DAAAA6WDpfX/LXT8NTCycbIicbIicaIicaIicbIjkN40POqK4vx4AAACQFpbe97fe82BwkjzTNnnmKpu2yYL2KQPunw8AAACkiaX3/W33PBSaIs92z/BzTjsz7MHz8QAAAID0sPS+v/3eh0LTVFnfbFkvm77Zsr65Ud/Cr17bme7lBQAAAG5ElsH39z0UnqE0A/OimAILW34P3wMAAABpYLl8f3FoQRRzkHzx9XfSvbwAAADAjcjS+/6OHz8ciV67ZCRFge8BAACAdLFcvpe+bQ6SL70B3wMAAABpAL4HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6B74HAAAArn/gewAAAOD6Z7l8zz32nos5SL70OnwPAAAApIGl9/3t9z0UnqEuDi0IYlgwB8kX4XsAAAAgHSyX7y/0z7GZv9A/rxmYNwUWtvwevgcAAADSwNL7/rZ7HwpNU+d6oiVcdNGy3tlR38KW13ame3kBAACAG5Gl9/2tdz8YnCTPtE0WtE0WtE0VtE0Vtk8Vd04Pe+Y3v7Ij3csLAAAA3Igsve//5c6f+scXvqsLf1cX/q4+fKI+fLIh8n3LxJBr9oWt29O9vAAAAMCNyNL7/ubbH/CF549e9B29xOT45cA3NaEBezTzt39O9/ICAAAANyJL7/t/vu0nntDcoXOuz9gcLnMfveTTj81k/PrtdC8vAAAAcCOy9L7/0S33u4NzB87YuXxS5Dhy3tNrnn7u399K9/ICAAAANyJL7/t/uuV+d2D241NWLgfO2D8rcfWap+B7AAAAIC0sT/s+MLv/e9vH39s+/t768SlrToH981I3fA8AAACki2Xw/a0/cQfnDhY66OQU2D8tdn5xwdNnmc74Dxy/BwAAANLAcp2vd7jM/XkpkyPnPccq/P3Wmed/A98DAAAAaWAZrse74wFfZP74Zf+xCia5VwLf1oYGHdGNv8P1eAAAAEAaWK777ZyoD9P5jr3fjsE1t2kb7q8HAAAApIGl9/0tdz8YnCQLmPvpTha0TRa2TxV3TQ975je/Ct8DAAAAaWAZnpdzz4OhKfKcduacduacNnpOGy3piZbieTkAAABA+liW5+OFp6nz+jkuF/rn8DxcAAAAII0sve9vv++h8AxVPrgQy9DCxaEFc5B88XX4HgAAAEgDy+X7SwZSECMJ3wMAAADpYul9f8ePH45Er1UYSVHMQfKlN+B7AAAAIA0sm+8lb8P3AAAAQLqA7wEAAIDrH/geAAAAuP6B7wEAAIDrH/geAAAAuP6B7wEAAIDrH/geAAAAuP6B7wEAAIDrH/geAAAAuP6B7wEAAIDrH/geAAAAuP6B7wEAAIDrH/geAAAAuP75YX2P5+ECAAAA6eCH8r2RNAfJF+F7AAAAIB0sh+8fikSpS8YFQQwL5iD54us70728AAAAwI3I0vv+9vseCs9QFw3zTIbozJkCC1t+D98DAAAAaWA5fP9geIbSDEQ1/TMXeBn1z215bXu6lxcAAAC4EVl6399274OhabJUN1GqGy/VjZfoxkt6xkt6xoe90c2vvJ3u5QUAAABuRJbe97fe80Bwar6ow1/Y4Sts9xW2ewvbvYXtPoN76oWtb6Z7eQEAAIAbkaX3/S133R+YmM1vtOU3Wk82WE82jJ1sGMtvtA06xjN/85/pXl4AAADgRmTpfX/zHff5IjO5V4aOXx48fnngWMXA8cuDeZUGvTX43H+8ke7lBQAAAG5Elt73N91+jzc8dbis+3BZ1+elXZ+XdB4u6/pSo+s1+9a/9Pt0Ly8AAABwI7L0vv/nW+/2BCcPFjYfLGjOKWjKOdN0sLDls3PtPaOedVteTffyAgAAADciS+/7H916lzsw8fGpOi4HTjd8UtSqHXav2/JKupcXAAAAuBFZBt/fcpc7ML4vv2Zffi2d/bTvR9xo3wMAAABpYRnb9/u/r9//fcOB0w0HC5o/O9euG/Wuf+m1dC8vAAAAcCOyjMfvPyls+aSo9dPiq5+d6/jiQk+v2f/cy6+ne3kBAACAG5HlOD//Xm9o6nBZ95Hz3UfOa7+40PNVed/xy4P91lDGr/+Q7uUFAAAAbkSW7fr7y4O5V4byKg15lcZvqkdO1JsHHeOZv/1jupcXAAAAuBFZrvvrnWy05jda85tsp5ps37c4zlx1G1xTm7bhfroAAABAGlie++dPztP3zC/s8BV1+Is7A2e7Q8Pe6OZX/pzu5QUAAABuRJbj+Xg/DU0v0A/HK9VNlPZOlPVOnu+bGvXNbXltR7qXFwAAALgRWXrf337fg+EZkn7mvaZ/RjMwoxmIagZmTYH5Lb/fme7lBQAAAG5Eltz3/z/BWNrL3hNUrwAAAABJRU5ErkJggg==" alt="" />
根据上图的执行结果,会发现SingletonTest对象被实例化了2次,按照单例模式(Singleton)的特性:一个类只能有一个实例,那就不是单例模式了,为什么会实例化两次呢?因为我们的计算机执行速度很快,在某一个时间点,线程1在执行完if (model==null)这段代码,还没执行model = new SingletonTest(),线程2刚好执行判断对象是否null,就是说线程1和线程2都会进入下面的if判断体中实例化对象。
关于单例模式的线程安全问题,网上一找一大堆,在《漫谈设计模式》这本书中,作者也提到了线程安全问题,java中是使用的是“Double-Check Locking”方法,还有序列化的问题,这边先不考虑,其实在.net中解决线程安全的问题也很简单,就是用lock锁,我们根据上面的代码,再来修改下,然后做个测试:
public class SingletonTest
{
private static SingletonTest singleton;
private static readonly object syncObject = new object();
/// <summary>
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
/// </summary>
private SingletonTest()
{ }
/// <summary>
/// 定义一个全局访问点
/// 设置为静态方法
/// 则在类的外部便无需实例化就可以调用该方法
/// </summary>
/// <returns></returns>
public static SingletonTest getSingleton()
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
Console.WriteLine(String.Format("我是被线程:{0}创建的!", Thread.CurrentThread.Name));
singleton = new SingletonTest();
}
}
}
return singleton;
}
}
执行结果:
aaarticlea/png;base64,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" alt="" />
从上面的执行结果我们就可以看到,对象仅被实例化了一次,在某段代码体中,只能有且只有一个线程访问,加锁的目的就好比:我们去火车站售票大厅买票,因为买票的人太多,为了缓解压力,就多开了几个售票窗口(线程),比如南京到徐州的G110次列车只有一张票,窗口A和窗口B的人同时都在买这一班次的票,这时候就要加锁,不然就有可能会出现只有一张票,但是卖出去两张。话题跑偏了,哈哈。
示例代码下载:Singleton.rar
后记
关于模式,再多说两句,在某些情况下,像上面所说的:模式可以看成现实生活中的模具,有些产品(项目)是由一种模具(模式)生成出来的,比如杯子、瓶子等,有些产品(项目)是由多种模具(模式)生成出来,然后组合而成的,比如汽车、飞机等,是由成千上万个零部件组合形成的。就是说学会模式后要会懂得组合,而且要“合适”的组合,这样才会做出一个完善的产品(项目)。
还是那就话:骚年们,和小菜一起整理学习吧,未完待续。。。