单例模式 Lazy 按需延迟加载

  在我们刚学设计模式的时候,单例模式可能是设计模式中最简单最容理解的吧。今天我们就来探究他不一样的风格,不一样的单例模式

  首先,我们来看一下通俗的单例模式的设计

  

public class Person
    {     //这里必须要写私有构造函数
        private Person() { }

        public string Name { get; set; }
        public string Age { get; set; }

        private static object obj = new object();
        private static Person _person;
    //单例属性
        public static Person Instance
        {
            get {
                if (_person == null)
                {
                    lock (obj)
                    {
                        if (_person == null)
                        {
                            _person = new Person();
                        }
                    }
                }
                return _person;
            }
        }
    }

    这种单例模式虽然正确的,但是要注意几个问题,

  第一 构造函数必须是私有构造函数

  第二 必须加上锁,才能保证唯一实例

  

   如果说到这里就完了,那我没有必要写这篇文章,因为你一百度就会有一大把。我会有什么不一样的风格,那我们还要学习一个知识点,那是在一篇文章中无意看到的(Lazy),他是一个按需加载的泛型类。

下面验证他是否是按需加载的类

 

1  Lazy<Person1> la = new Lazy<Person1>();
2             Console.WriteLine(la.IsValueCreated); //实体是否被创建
3             Console.WriteLine(la.Value.Name);
4             Console.WriteLine(la.IsValueCreated);
5 class Person1
6     {
7         public string Name { get { return "啄木鸟"; } }
8     }

得出结果

从上面的结果看来,他确实是按需加载, 那按需加载他有什么好处,好处在于他能在 需要他的时候实例,防止系统刚启动时慢,等原因,

要解决单例模式,必须要在多线程内唯一,Lazy 解决了线程 内的唯一(他的详细内容 请百度,因为他在这篇文章中不是重点)

有了这些知识点有没有想把他封装成一个基类 ,只要继承他就实现了单例模式,这就是我说的不一样的风格

 public abstract  class Singleton<TEntity> where TEntity:class
    {
        private static readonly Lazy<TEntity> m_Instance = new Lazy<TEntity>(() => {
            var ctors = typeof(TEntity).GetConstructors(
                BindingFlags.Instance
                |BindingFlags.NonPublic
                |BindingFlags.Public);
            if (ctors.Count() != 1)
            {
                throw new InvalidOperationException(String.Format("类 {0} 必须包含一个构造函数", typeof(TEntity)));
            }
            var ctor = ctors.SingleOrDefault(c=>c.GetParameters().Count()==0&&c.IsPrivate);
            if (ctor == null)
            {
                throw new InvalidOperationException(String.Format("构造函数{0}必须是无参数并且私有的", typeof(TEntity)));
            }

            return (TEntity)ctor.Invoke(null);

        });

        public static TEntity Instance
        {
            get { return m_Instance.Value; }
        }
    }

  继承单例内代码

  

 public class Person : Singleton<Person>
    {
        private Person() { }

        public string Name { get; set; }
        public string Age { get; set; }

    }

  调用方式

  

 Console.WriteLine(Person.Instance.Name);

  结果:

这样是不是简单多了,如果有什么不懂的地方 QQ:209229923

 

  

时间: 2024-07-31 19:36:59

单例模式 Lazy 按需延迟加载的相关文章

.NET泛型04,使用Lazy&lt;T&gt;实现延迟加载

对于一些"大对象"的创建,我们常常希望延迟加载,即在需要的时候再创建对象实例.现在Lazy<T>很好地支持了这一特点.主要包括: 没有Lazy<T>之前 Lazy<T>实例 延迟加载的本质 没有Lazy<T>之前 在没有Lazy<T>之前,我们通过如下方式实现延迟加载. public class LazySinleton { private LazySingleton() {}   public static LazySing

jquery实现图片按需延迟加载原理

为什么我们需要图片按需加载? 网站中的图片可以使网站添加不少"色彩", 但大量的图片会使我们打开的速度下降, 但我们又不得不用这些图的时候, 我们可以变相的加载这些图片, 常见与一些列表页啊, 或者大数据的主页啊, 或者 "全是图" 的页面, 那么这个图片加载就显着重要了, 比如 jd,taobao啥的都在用, 所以说 你并不孤单! 数据显示通过按需加载图片可以大大的提高网站的打开速度! 1, 首先我们得改变这些图片的HTML结构, 把图片的 src 换成一个 &q

jQuery Lazy Load 图片延迟加载

基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery Lazy Load v1.7.2 注意事项: 需要真正实现图片延迟加载,必须将真实图片地址写在 data-original 属性中.若 src 与 data-original 相同,则只是一个特效而已,并不达到延迟加载的功能. 载入 JavaScript 文件 <script src="jqu

C# 单例模式Lazy&lt;T&gt;实现版本

非Lazy版本的普通单例实现: public sealed class SingletonClass : ISingleton { private SingletonClass () { // the private contructors } public static ISingleton Instance { get { if (instance == null) { lock (InstanceLock) { if (instance != null) { return instance

使用Lazy&lt;T&gt;实现对客户订单的延迟加载

"延迟加载"是指在需要的时候再加载数据.比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再加载.简单来说,就是按需加载.使用"延迟加载"的好处是减少应用程序响应时间,降低内存消耗,避免不必要的数据库交互. □ 即时加载 创建Order类和Customer类,Customer中维护着Order的一个集合,在Customer的构造函数中给Order集合赋值.即,只要创建Customer实例,就会加载

Hibernate的延迟加载 ,懒加载,lazy

Hibernate延迟加载有很多配置方法,本文主要说明几种常用的配置方法,以及在Session的get()和load()方法,Query对象的iterator()和list()方法中的效果.下面是本例用到的两张表.实体类和配置信息: Company表: Employee表(employee_company_id为外键) Company实体类: import java.util.Set; public class Company {    private int companyId;    pri

C# 单例模式(Singleton Pattern)

(新手写博客,主要是对自己学习的归纳总结.会对很多小细节详解.) 单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点. 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例. Q:如何只生成一个实例? A:1)首先必须将构造函数变为私有从而防止其他类实例化,并且只能有一个构造函数.因为系统会默认一个无参构造函数,而且默认public访问修饰符. 所以必须写一个私有无参让默认无效.(通常单例模式都是不带形参的) 2)在该类中声明

浅析java单例模式

单例模式:运行期间有且仅有一个实例 一. 关键点: 1.一个类只有一个实例------最基本的-----(只提供私有构造器) 2.该类必须自行创建这个实例-----(定义了静态的该类的私有对象) 3.该类必须自行向整个系统提供这个实例---(提供一个静态的公有方法,返回创建或者获取本身的静    态私有对象) 二.基本单例模式 1.懒汉模式 懒汉模式:在类加载的时候,不创建实例,运行调用的时候创建(以时间换空间) 优缺点:类加载快,在运行时获取速度慢:线程不安全: 解决懒汉模式线程安全方法:(1

【设计模式】-单例模式

单例模式很简单,就是在整个应用程序生命周期中只拥有一个实例. 如果不是很明白思路 可以把代码考下去自己执行一下 应该就明白了 一.单例模式是用来实现在整个程序中只有一个实例的. 二.单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点. 三.单例模式在多线程下的同步问题和性能问题的解决. 四.懒汉式和饿汉式单例类. 五.C# 中使用静态初始化实现饿汉式单例类. /// <summary> /// 一.经典模式: /// </summary> public class Sin