成都,夜未眠

 
 
昵称:光希
园龄:3年10个月
粉丝:0
关注:0

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

我的标签

  • 设计模式(5)
  • 迭代器(1)

随笔分类

  • 程序理论(7) (rss)
  • 程序人生(2) (rss)

随笔档案

  • 2008年8月 (1)
  • 2008年7月 (8)
  • 2008年3月 (1)

文章分类

  • .net夜未眠(1) (rss)

友情链接

  • AspNeter园

最新评论

阅读排行榜

评论排行榜

推荐排行榜


Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年8月12日

设计模式学习之路-5-单体Singleton-你只能有一个老婆

这篇比较好理解,就是说让类的对象实例只产生一个。

例如,老婆这个类Wife,你只能有一个实例。

在写程序时,我们可以让程序员只写一次new Wife(),这样可以只产生一个wife。

但是有些程序员不按照这个规定进行,那么我就要用机制来保障你只能有一个wife。

上代码,看看这个wife类是如何构成的。

 

public class Wife
    {
        private string name;
        private static Wife wife = new Wife();
       
        private Wife()
        {
            //不允许私自构造一个老婆
        }

        public static Wife getWife()
        {
            return wife;
        }

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }
    }

只所以我们用private的构造函数,是因为不能用new去构造一个wife。

而必须用getWife()去得到一个wife。

那我们现在来测试一下,你是不是真的只能有一个老婆。

 

            Wife wife1 = Wife.getWife();
            wife1.Name = "张mm";

            Wife wife2 = Wife.getWife();
            wife2.Name = "王mm";

            Console.WriteLine("老婆1: {0}", wife1.Name);
            Console.WriteLine("老婆2: {0}", wife2.Name);

输出是:

老婆1:王mm

老婆2:王mm

奇怪,张mm哪里去了?

我们再用ReferenceEquals(object objA, object objB)这个函数来看看两个老婆一不一样

ReferenceEquals的作用是:

如果 objA 是与 objB 相同的实例,或者如果二者都为空引用,则为 ture;否则为 false。

 

if (object.ReferenceEquals(wife1, wife2))
            {
                Console.WriteLine("两个老婆是一样的");
            }
            else
            {
                Console.WriteLine("两个老婆不是一样的");
            }

输出:

两个老婆是一样的

我们在声明wife2时,实际上是返回的wife1,所以这样我们就实现了单体的模式。

 

还有一种写法:

public class Wife
    {

        private string name;

        private static Wife wife = null;

        private  Wife()
        {
            //不允许私自构造一个老婆
        }

       

        public static Wife getWife()
        {

            if (wife == null)
            {
                wife = new Wife();
            }
           return wife;
        }

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }

}

我们也可以看见在很多书上也是这么写的。实际上严格的说这个并不能算作是一个单体模式。

之所以这样说,这个和多线程结构有关系。

 好我们用多线程来测试一下:

Main()

{

 

System.Threading.Thread thread1 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(getYourWife));

System.Threading.Thread thread2 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(getYourWife));

thread1.Start("张mm");

thread2.Start("王mm");

}

 

private static void getYourWife(object name)
        {
            Wife wife = Wife.getWife();

            wife.Name = (string)name;

            Console.WriteLine(wife.Name);
        }

输出是:

张mm

王mm

 

恭喜你,你用这个漏洞得到了两个老婆。

那如何改进呢?

我们这个时候就要用到静态构造函数了,静态构造函数是在装载类的时候就执行。

public Class Wife

{

static Wife()
        {
        //不允许私自构造一个老婆
        wife = new Wife();
        }

        private string name;
        private static Wife wife = null;
        public static Wife getWife()
        {

           return wife;
        }

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }

}

posted @ 2008-08-12 19:12 光希 阅读(134) 评论(0) 编辑
 

2008年7月31日

设计模式学习之路-4-工厂方法Factory
摘要: 上一章我们讲了模板方法,并复习了一下c#的继承的一些语法。 今天讲的工厂方法其实和模板方法有一个共同的特点,就是,将建立对象实例都交给子类。 其实形象一点说,工厂模式就好比,mm告诉你她要吃汉堡包,那你要做的就是带她去KFC。 阅读全文
posted @ 2008-07-31 19:29 光希 阅读(143) 评论(1) 编辑
 

2008年7月29日

设计模式学习之路-3-模板方法Template
摘要: 上一篇文章讲了适配器Adapter模式。 这一次讲讲模版Template,其实这一章挺简单的, 当你使用了继承,那你就用了模板方法,只是你可能不知道这个就叫做模板方法。 其实模板方法的核心就是把实际的处理交给子类处理。阅读全文
posted @ 2008-07-29 21:37 光希 阅读(831) 评论(0) 编辑
 
程序员相亲记之二血色浪漫
摘要: 上一篇写了前不久遇到的一个准博士mm,兄弟们认为结局比较悲壮,甚至喊出了“哥们儿,你要挺住”,先谢谢兄弟们的关心了, 其实我比大家想想中的要坚强,这回写的是我第一次去相亲的经历。 都是几年前的夏天的事情了,那时刚毕业,经朋友介绍去相亲,第一次。阅读全文
posted @ 2008-07-29 12:49 光希 阅读(281) 评论(4) 编辑
 

2008年7月28日

设计模式学习之路-2-适配器Adapter
摘要: 上一节我们讲了迭代器Iterator模式 http://www.cnblogs.com/lee22536973/archive/2008/07/28/1254192.html 这一节我们要讲一个适配器Adapter模式 适配器模式比较好理解,好比一个220v交流电可以用一个交流电适配器转化成直流12v供笔记本使用一样。 程序也比较简单。一般是通过继承的方式进行。 阅读全文
posted @ 2008-07-28 20:09 光希 阅读(121) 评论(1) 编辑
 
一道看似简单,实际很难的平面几何题,和大家分享一下。

本题是一道著名的平面几何难题, 由几何学家蓝利(E.M.Langley)在1922年提出的.

看着很简单,以为加加减减就能出来,结果哥们儿我算了20分钟都没有算出来。

△ABC中,∠CAB=∠CBA=80度,D、E分别是AC、BC上的点,其他的度数上面都有,求∠AED的度数.

要求只能用最简单的平面几何定理,比如三角形内角和等于180度,对角相等等等,不能用三角函数之类的。 

posted @ 2008-07-28 14:43 光希 阅读(1846) 评论(8) 编辑
 
程序员相亲记之准博士mm
摘要: 哥们儿今年25,本科计算机系毕业,工作3年,目前在成都某公司做程序员,前段时间成都地震,震垮的不止是灾区的房屋,还有我的爱情。 看来是没有经起考验了,这样的爱情不要也罢。谁也没有对不起谁,谁也没有吃亏。 哥们儿痛定思痛,决定洗心革面重新做人,从此看到女人不动邪念,把自己献身给伟大的程序事业。 分手后的两个星期,自己空了一个人看看书,打打球,三五朋友跑泡泡吧,喝喝酒。过得也充实滋润。 可是有些时候总是树欲静而风不止,家里面听说我分手的消息,那些七大姑八大姨就坐不住了, 终于在千挑万选之下,舅妈介绍了一个她的助手的大学同学(注:我舅妈是成都某医院的医生)。阅读全文
posted @ 2008-07-28 13:59 光希 阅读(629) 评论(18) 编辑
 
设计模式学习之路-1-迭代器Iterator
摘要: 在这一章我们将讲述一个如何来迭代一个部门(Department)中的员工(Person)。 我们在用.net 语言输出一个数组时,会使用到for语句: string[] arr = new string[5]; for(int i=0;i < arr.length; i++) { Console.write(arr[i]); } 这样递增i的值,可以对数组进行依次的遍历。 迭代器模式也是依次遍历并处理多个数字或者变量。阅读全文
posted @ 2008-07-28 10:58 光希 阅读(366) 评论(0) 编辑
 

2008年7月27日

设计模式学习之路-0-序言
摘要: 第一次接触设计模式,还是在成都新蛋面试的时候,网上说新蛋里面非模式不谈。下来就看了一下设计与模式那本经典的教材,结果发现自己什么都没有看懂,所以一直觉得设计模式是一种很高深的东西。在程序俱乐部里和朋友们讨论的时候,朋友们也是这样认为,认为非5年的程序老鸟是搞不定这东西的。后来偶然之中,发现结城浩写的《设计模式-JAVA语言中的应用》,这本书虽然是用java写的,但是和.net的语法基本差不多,讲的浅显易懂,才知道当时书选错了。 在当前很多的面试中,都会遇到设计模式的题目,甚至还出现了一些专门生成设计模式代码的软件,其实个人认为这个有点教条主义。 阅读全文
posted @ 2008-07-27 22:39 光希 阅读(1489) 评论(12) 编辑
 

2008年3月20日

我的离职申请
posted @ 2008-03-20 11:20 光希 阅读(9388) 评论(16) 编辑
 
仅列出标题