没有与参数列表匹配的构造函数_c#设计模式,单例模式,静态构造函数设计的单例模式,你见过没?...

什么是单例模式

单例模式(Singleton Pattern)是 C#中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式实现的条件

· 1、单例类只能有一个实例。

· 2、单例类必须自己创建自己的唯一实例。

· 3、单例类必须给所有其他对象提供这一实例。

单例模式介绍

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

优点:

· 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

· 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

· 1、要求生产唯一序列号。

· 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

· 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

单例模式的实现

双检锁/双重校验锁 简称双if+lock

使用双if+lock这种方式实现最大的优点就是线程安全,缺点是加锁影响效率。

3ecbc17c8b2d06cede410c6d1154449e.png

源码

//双if+lock
class Sigleton
{
private Sigleton()
{
}
private static Sigleton _Sigleton=null;
private static Object sigleton_lock = new object();
public static Sigleton CreateInstance()
{
if(_Sigleton==null)
{
lock (sigleton_lock)
{
if (_Sigleton == null)
{
_Sigleton = new Sigleton();
}
}
}
return _Sigleton;
}
}

饿汉式单例-----利用静态构造函数

首先介绍静态构造函数

1静态函数没有修饰符修饰(默认修饰符为private,但是你不能写出来)

2.静态构造函数是系统默认调用的,程序员无法手动调用

3.如果类中没有静态构造函数,而此时类中包含静态字段(未初始化的)那么此时编译器会默认生成静态构造函数

4.在静态类中或方法中,不能使用对象

5.如果类中包含静态成员,且没有被初始化,系统会默认提供一个默认的值,这也间接说明了我们不可以直接调用静态构造函数,这也没办法控制静态函数的执行时间

6.静态构造函数只能被调用一次,并且不能有重复

7.静态构造函数不能有参数

8.虽然静态构造函数和普通构造函数名字一样,但是系统规定他俩可以共存,尽管参数列表一样

9.静态构造函数是在普通构造函数调用之前执行,一般情况下用于初始化静态字段或者拦截在实例化之前

静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次

068ddf07999058ff0781c7f24921b95e.png

源码

//单利模式第二种写法
class SigletonSecond
{
private SigletonSecond()
{
}
private static SigletonSecond _Sigleton = null;
//静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
static SigletonSecond()
{
_Sigleton = new SigletonSecond();
}
public static SigletonSecond CreateInstance()
{
return _Sigleton;
}
}

饿汉式

静态变量:会在类型第一次使用的时候初始化,而且只初始化一次

4efcb3dbe34b5bbe0d866182f39b7d78.png

源码

//单利模式第三种写法
class SigletonThird
{
private SigletonThird()
{
}
//静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
private static SigletonThird _Sigleton = new SigletonThird();
public static SigletonThird CreateInstance()
{
return _Sigleton;
}
}

总结

在内存中只有一个对象,节省内存空间;

避免频繁的创建销毁对象,可以提高性能;

避免对共享资源的多重占用,简化访问;

为整个系统提供一个全局访问点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值