单实例对象设计模式

作者:amberlife 发表时间:06月 6, 2009  |  没有评论

单例模式是一种创建型模式,所谓创建型模式就是对实例的生成过程进行管理的一类模式。当编程的时候我们常常有一个这样的问题,我们需要写一个类,规定这个类只能产生一个实例,这个实例在全局被所有类都能够调用到,这个时候我们所使用的就是单例模式。
单实例对象设计模式提供了一个关于私有和静态构造函数的非常好的一个实例。下面我们看一个例子:

using System;
 
namespace Donis.CSharpBook
{
     public class Chessboard{
	private Chessboard(){}
	static Chessboard()
	{
	    board = new Chessboard();
	    board.start = DateTime.Now.ToShortTimeString();
	}
	public static Chessboard board = null;
	public string player1 ; 
	public string player2 ;
	public string start;
    }
    public class Game{
           public static void Main(){
   	Chessboard game = Chessboard.board;
	game.player1 = "sally";
	game.player2 = "Bob";
	Console.WriteLine("{0} played {1} at {2}",game.player1,game.player2,game.start);
          }
    }
}

在这个例子中。首先我们可以看到一个私有的构造函数,因为私有的构造函数本身是不能在类外部被访问的,那么就只有在类的内部进行访问了。于是看下面的静态构造函数中显示调用了私有构造函数,实例化了该类,并将它赋予静态成员 board.
这样就可以通过静态实例来访问类的实例成员(看这行代码:Chessboard game = Chessboard.board;),因为静态构造函数总是自动调用的。

让我们在看看下面这个JAVA的例子:

package src;
 
public class Stin {
    private Stin()//代码段1
    {
 
    }
    private static Stin stin;//代码段2
    public static Stin getStin()//代码段3
    {
        if(stin==null)//代码段4
        {
            stin=new Stin();//代码段5
        }
        return stin;
    }
}

在这段代码中我们可以看见一些与一般的类不同的地方,当然,单例规定的是所有类都可以调用到,那么这个类首先要是public属性。
首先看这个类的构造方法(代码段1),它的构造方法是一个私有的构造方法,我们知道私有构造方法的类是不能够外部被实例化的,这样的目的就使限制外部类使用new关键字来创建实例而达到实例不会被随意的创建出来(当然利用反射还是可以实例化的,这里只是一种编译上的限制)。那么既然外部不能够实例化,那就只好内部实例化了(代码段5)。
如果要被外部访问到,又不能外部实例化,要得到内部实例化的类就必须要是静态属性和静态方法,我们知道静态属性和方法可以通过类直接访问到而不用实例化,通过这一点我们可以获取到被类内部实例化的实例(代码段2和代码段3都是静态的)。当进入到实例生成的方法中判断是否已经生成实例(代码段4),如果没有就生成,如果有就直接返回,这样就实现了单例。在整个应用中只能生成一个实例,而生成的这一个实例能被应用中所有类调用到。
单例模式应用的场合和多,而且也有很多不同的变化。

类别:设计模式

c# 多线程编程 <转>

05月 22, 2009   |  没有评论

一.多线程的概念
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。
多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
然而我们也必须认识到线程本身可能影响系统性能的不利方面,以正确使用线程:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多
多线程需要协调和管理,所以需要CPU时间跟踪线程
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题
线程太多会导致控制太复杂,最终可能造成很多Bug

入室抢劫

05月 17, 2009   |  2 条评论

在美国,每个15秒钟就有人举报一起入室行窃案,统计数据显示,去年窃贼逛够了两百多万户人家。人们实际上几乎无法将蓄意行窃的盗贼拒之门外,所以做得只是设法拦截他片刻,从而使其暴露在巡警或者附近溜达的人们面前。常识告诉我们,光照是犯罪行为的障碍物。家门口必须安装一盏灯,并在晚上开着。不管是否相信,有些人,尤其是最晚进家的孩子,晚上进屋后不把门锁上。空心门,即便是锁上了,也容易遭贼入侵。因此最好选择实心门或者铁门,因为窃贼很难将它们撬开。如果你有意购买报警装置,别忘了索要报警器的标志,并把它们贴在窗户和门上。最后,提醒一句,外出旅游时,一定要请一位信得过的邻居,再你回来前,收好每日的报纸和邮件。这是因为放在门阶上或邮箱里成堆的报纸邮件如同广告一样让大家都知道你家里没人。

进入ASP.NET的学习领域

05月 17, 2009   |  没有评论

最近一周进入了ASP.NET的学习中,把《visual studio 2005从入门到精通》看了个大概,也没明白个究竟,看来这本书还就是让你会操作visual studio的,而不是讲知识的。不过发现自己在接触新的东西的时候,往往在没有老师的指点下,一般都是撞得“头破血流”之后自己才有了如梦初醒的感觉。之后老师在那么一讲解,就有醍醐灌顶的感觉了。最近一周的生活有点混乱,每天都到晚上3点钟才睡着。早上的时间基本上就没办法利用。
我的英语啊,要考四级呀。英语还是要背诵的,必须抽出时间读英语。这是必要的。不然四级铁定考不过,以后再看个英文的技术文章,就不用每每的拿着个词典在那查啊查的了。在博客里面新开个英语的栏目,把我背诵过得,写过的文章发一下,惊醒一下自己吧。
c#的所涉及的范畴,学了已经多过半个学期了。有了一个大概。如果现在让我做一个winform我想,我自己肯定做不出来,现在心里对winform也没有很清晰的轮廓。就凭课本那本书还远远的不够,多看书,看经典教材。争取自己做一个桌面程序出来,自己看看。心里也有个底。还是要理解面向对象。深入的理解。

哎,学习的过程总是这样子

05月 2, 2009   |  4 条评论

好久没有认真的写过代码了,这个学期本来也是刚开始学习c#,今天做了个MDI窗体的记事本,费劲脑子,最终有个问题还是没有解决,感觉自己还是不能从总体上把握面向对象,用空间用的多了,就不知道该怎么手写函数了。抄别人的代码抄的多了,就不会自己写代码了。一帆风顺的学习过程是不会有结果的。尤其是向我们这样的学科,重在实践,实践中出真知。要努力实践,努力接受实践中所所遇到的问题,可能问题把脑子想破也有时候也不会,原因不是自己不会,是自己还没有学习那么深。可是自己学了那么深的时候就会解决这个问题了吗?不见得,问题来的时候,会让自己的心情有所沮丧,可是回头来还是要面对,作业还是要完成,任务还是要完成,要保持一颗平和的心去理解。
在学习c#的过程中,感觉最难受的就是没有一个好的同伴可以一同学习,没有一个好的老师可以指点迷津,老师都太忙,老师也太远。哎,如果可以有一个有经验的人带一带,我想我一定可以突飞猛进的。