单例模式
代码实例为单例模式。该代码以果园喷洒杀虫剂为例实现单例模式的用法。目前在北京和上海两地都有果园,而只有一架直升机往返于两地,为两地的果园喷洒杀虫剂。该代码利用了单例模式使直升机实例全局唯一。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Singleton
{
class Helicopter {
//直升机实例
static Helicopter helicopter;
public static Helicopter Instance {
get
{
//如果直升机未创建
if (helicopter==null) {
//延迟创建直升机实例
helicopter = new Helicopter();
}
return helicopter;
}
}
//直升机受保护的 构造方法
protected Helicopter() {}
//杀虫剂数量
int insecticide = 100;
//指定城市的果园喷杀虫剂
public void SprayInsecticide(string city) {
this.insecticide -= 50;
Console.WriteLine("为{0}的果园喷洒杀虫剂", city);
if (this.insecticide == 0)
{
Console.WriteLine("杀虫剂用完了");
}
else {
Console.WriteLine("杀虫剂还剩余{0}吨",this.insecticide);
}
}
}
class Program
{
static void Main(string[] args)
{
//获取北京直升机
Helicopter bjHelicopter = Helicopter.Instance;
//为北京喷洒杀虫剂
bjHelicopter.SprayInsecticide("北京");
//获取北京直升机
Helicopter shHelicopter = Helicopter.Instance;
//为北京喷洒杀虫剂
shHelicopter.SprayInsecticide("上海");
Console.ReadKey();
}
}
}
代码解析:
上述代码实现了单例模式。代码中创建了一个名为 Helicopter 的直升机类,该类中有一个Helicopter类型的私有静态变量helicopter和一个Helicopter类型的公有属性Instance,其中helicopter 用来保存 Helicopter 的全局唯一实例,而当第一次获取 Instance 属性时实现了对Helicopter 类的实例化,并将该实例赋值给 singleton 变量,如果再次获取 Instance 时,会返回singleton变量,这样永远只能调用唯一的Singleton实例,从而就实现了单例模式。从实例运行的结果中可以看出,北京直升机和上海直升机是同一个实例,当直升机为北京果园喷洒完杀虫剂后,再为上海的喷洒杀虫剂,这时杀虫剂刚好用完,如果两个直升机不是同一实例,此时的杀虫剂是不会用完的。
说明:
单例模式主要实现了对自身实例的一种创建,而且该实例是全局唯一的,并向全局提供该实例的获取接口。单例模式的主要好处在于实例的创建过程推迟到对该实例调用的时候,实现了类的延迟加载