WPF+MVVM插件化架构-基本技能之单利模式
2016-05-13 09:09
507 查看
壳的搭建中,在给标题绑定数据时,的代码如下
Title="{BindingPath=SystemTitle,Source={x:StaticMApp:MApp.Instance}}"
我们用到了一个单例,那么下面来说说单例以及它在整个插件式架构和开发中的作用。
插件式架构中,我们经常会需要一个系统生命周期中的唯一实体来存储一些数据信息,并且这些数据信息能很好的被各个插件使用,这时候我们自然而然的就会想到单例模式,那么究竟什么是单例模式呢?
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
下面我们就来创建一个单例例子,代码如下:
/// <summary>
///单例实体
/// </summary>
public class Mdemo
{
/// <summary>
///定义一个私有的静态全局变量来保存该类的唯一实例
/// </summary>
private static MDemo singleton;
/// <summary>
///定义一个只读静态对象
///且这个对象是在程序运行时创建的
/// </summary>
private static readonly objectsyncObject = new object();
/// <summary>
///构造函数必须是私有的
///这样在外部便无法使用 new来创建该类的实例
/// </summary>
private MDemo()
{
}
/// <summary>
///定义一个全局访问点
///设置为静态方法
///则在类的外部便无需实例化就可以调用该方法
/// </summary>
public static MDemo Instance
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
//第一重singleton == null
get
{
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton ==
null
if (singleton == null)
{
singleton = newMDemo();
}
}
}
return singleton;
}
}
从上面的代码中我们看到,定义了一个私有的静态全局变量singleton来保存该类的唯一实例。
该单例类的构造函数必须是私有的,这样在外部便无法使用 new 来创建该类的实例。
那么,我们如何来初始化和使用单例呢?一般单例的初始化放在单例引用的方法或属性中,我们这里为了实现数据界面绑定,我们采用提供属性的方式来供外部使用,并在属性中初始化单例。
在初始化前两次判断单例实体singleton是否为空,第一次是为了在使用单例实体时,判断单例是否已经初始化。第二次是为了在初始化单例时,将初始化单例放到对象锁中后,再一次判断但是是否已经被初始化,因为有可能在加锁后单例已经被别的程序初始化了,如果不进行二次判断的话,再次初始化,那么单例存储的数据信息将会被覆盖。
基本的单例我们已经建立完成,我们只要将需要存储的数据信息作为属性放到单例中,给予赋值即可存储数据信息。
由于单例在第一次调用时就会创建,创建的实例将会在应用程序的整个生命周期中存在,也就是说单例会一直占用着相应的资源,所以在使用单例的过程中也要考虑清楚,是否需要使用,需要慎用。
Title="{BindingPath=SystemTitle,Source={x:StaticMApp:MApp.Instance}}"
我们用到了一个单例,那么下面来说说单例以及它在整个插件式架构和开发中的作用。
插件式架构中,我们经常会需要一个系统生命周期中的唯一实体来存储一些数据信息,并且这些数据信息能很好的被各个插件使用,这时候我们自然而然的就会想到单例模式,那么究竟什么是单例模式呢?
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
下面我们就来创建一个单例例子,代码如下:
/// <summary>
///单例实体
/// </summary>
public class Mdemo
{
/// <summary>
///定义一个私有的静态全局变量来保存该类的唯一实例
/// </summary>
private static MDemo singleton;
/// <summary>
///定义一个只读静态对象
///且这个对象是在程序运行时创建的
/// </summary>
private static readonly objectsyncObject = new object();
/// <summary>
///构造函数必须是私有的
///这样在外部便无法使用 new来创建该类的实例
/// </summary>
private MDemo()
{
}
/// <summary>
///定义一个全局访问点
///设置为静态方法
///则在类的外部便无需实例化就可以调用该方法
/// </summary>
public static MDemo Instance
{
//这里可以保证只实例化一次
//即在第一次调用时实例化
//以后调用便不会再实例化
//第一重singleton == null
get
{
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton ==
null
if (singleton == null)
{
singleton = newMDemo();
}
}
}
return singleton;
}
}
从上面的代码中我们看到,定义了一个私有的静态全局变量singleton来保存该类的唯一实例。
该单例类的构造函数必须是私有的,这样在外部便无法使用 new 来创建该类的实例。
那么,我们如何来初始化和使用单例呢?一般单例的初始化放在单例引用的方法或属性中,我们这里为了实现数据界面绑定,我们采用提供属性的方式来供外部使用,并在属性中初始化单例。
在初始化前两次判断单例实体singleton是否为空,第一次是为了在使用单例实体时,判断单例是否已经初始化。第二次是为了在初始化单例时,将初始化单例放到对象锁中后,再一次判断但是是否已经被初始化,因为有可能在加锁后单例已经被别的程序初始化了,如果不进行二次判断的话,再次初始化,那么单例存储的数据信息将会被覆盖。
基本的单例我们已经建立完成,我们只要将需要存储的数据信息作为属性放到单例中,给予赋值即可存储数据信息。
由于单例在第一次调用时就会创建,创建的实例将会在应用程序的整个生命周期中存在,也就是说单例会一直占用着相应的资源,所以在使用单例的过程中也要考虑清楚,是否需要使用,需要慎用。
相关文章推荐
- C#及WPF获取本机所有字体和颜色的方法
- WPF MVVM示例讲解
- WPF实现时钟特效
- PowerShell中调用WPF生成炫酷窗口实例
- WPF实现类似360安全卫士界面的程序源码分享
- C#中WPF使用多线程调用窗体组件的方法
- WPF实现渐变淡入淡出的登陆窗口效果
- WPF的数据绑定详细介绍
- WPF绑定实例详解
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- 关于WPF使用MultiConverter控制Button状态的详细介绍
- 如何搭建新的WPF项目框架
- 超炫酷的WPF实现Loading控件效果
- 解析WPF实现音频文件循环顺序播放的解决方法
- MVVM模式中ViewModel和View、Model有什么区别?
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(二)
- JavaScript数据绑定实现一个简单的 MVVM 库
- 浅谈 MVC、MVP 和 MVVM 架构模式
- 翻译-ExtJs5 Mvvm
- 用vs2012创建第一个wpf应用