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