单例模式介绍:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
单例模式的要点:
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
为什么会有单例模式
为什么要有单例模式的?它在什么情况下使用的?
从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,自然在软件设计领域必须 有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。
单例模式的例子:
歌曲点歌案例
歌曲类的代码如下:
namespace Chapter_07单例模式 { /// <summary> /// 歌曲类 /// </summary> public class Songs { //歌曲名称 public string SongName { get; set; } //歌曲路径 public string SongPath { get; set; } public string SingImg { get; set; } } }
主窗体代码如下:
namespace Chapter_07单例模式 { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { Init(); BindData(); dgvSongList.Columns[0].HeaderText = "歌曲名称"; dgvSongList.Columns[1].HeaderText = "歌曲路径"; dgvSongList.Columns[2].HeaderText = "歌手照片路径"; dgvSongList.Columns[2].Visible = false; } public List<Songs> list; //初始化歌曲信息 public void Init() { list = new List<Songs>(){ new Songs(){SongName="dodie - 时代在召唤(Dodie Mashup).mp3",SongPath="C:\Users\ASUS\Music\dodie - 时代在召唤(Dodie Mashup).mp3",SingImg="C:\Users\ASUS\Desktop\阿苏\1.jpg"}, new Songs(){SongName="尚琪祺 - 最美的光.mp3",SongPath="C:\Users\ASUS\Music\尚琪祺 - 最美的光.mp3",SingImg="C:\Users\ASUS\Desktop\阿苏\2.jpg"}, new Songs(){SongName="薛之谦 - 认真的雪.mp3",SongPath="C:\Users\ASUS\Music\薛之谦 - 认真的雪.mp3",SingImg="C:\Users\ASUS\Desktop\阿苏\103.jpg"} }; } //数据绑定 public void BindData() { dgvSongList.DataSource = new BindingList<Songs>(list); } //右键菜单的"播放"的单击事件 private void 播放ToolStripMenuItem_Click(object sender, EventArgs e) { FrmPlay play = FrmPlay.GetInstance(); play.path = dgvSongList.SelectedRows[0].Cells[1].Value.ToString(); play.imgPath = dgvSongList.SelectedRows[0].Cells[2].Value.ToString(); play.Show(); play.PlayImg(); play.PlaySong(); } } }
歌曲播放窗体代码如下:
namespace Chapter_07单例模式 { public partial class FrmPlay : Form { //构造函数私有化 private FrmPlay() { InitializeComponent(); } //静态变量 保存唯一的实例 private static FrmPlay only; //歌曲路径 public string path; //歌手照片路径 public string imgPath; //公有的一个静态方法 返回一个实例 public static FrmPlay GetInstance() { if(only==null){ only = new FrmPlay(); } return only; } //歌曲路径 public void PlaySong() { Player1.URL = path; } //歌手图片路径 public void PlayImg() { picSingImg.ImageLocation = imgPath; } private void FrmPlay_Load(object sender, EventArgs e) { } private void FrmPlay_FormClosing(object sender, FormClosingEventArgs e) { only = null; } } }