单例模式
namespace 单例模式
{
class program
{
static void Main(string[] args)
{
sington s = new sington();
s.returnstring();
}
}
class sington
{
public sington()
{
}
public void returnstring()
{
Console.WriteLine("我是单例模式");
}
}
}
分析: 普通的类和系统的类我们实例化的时候是利用类里面的无参构造函数,如果没有无参构造类没有办法实例化 有的人可能会问,我们自定义类的时候没有写无参构造函数时 也可以进行实例化啊,你怎么会说没有无参构造函数不能进行实例化,其实原理是这样的,当我们自定义一个类的时候不写无参构造函数,这时候我们在进行实例化的时候系统会为我们写一个无参构造函数,如果我们在写类的时候显示写出无参构造函数,系统就不会为我们在提供一个默认的无参构造函数。
(扩展:其实利用无参构造函数实例化,原理是因为反射, 反射必须要有无参构造函数,EF框架原理也用到反射了,这些知识你们可以了解下)
上面的例子是普通的类进行实例化,这样写不能保证一个类只能产生一个对象,我们可以实例化很多对象比如: sington s = new sington();
sington d = new sington();
sington f = new sington();
这样写就有多个对象,多个对象有时候不能保证线程安全。
下面我们分析怎样才能产生一个对象呢???
根据上面的分析我们知道一个类产生多个对象的原因是因为外界可以操作这个对象,在外界就把这个对象实例化出多个,怎样才能避免外部直接访问这个对象的实例呢?? 外界实例化对象是因为类里面有个公开的无参构造,外界利用这个公开的无参构造可以实例化多个对象,那么我们把这个无参构造不让外界访问不就行了吗?? 有的同学可能想到了,对没错就是把访问权限public改成private 这样我们就能实现外界无法直接操作这个无参构造 也就说明 外界不能直接进行实例化了?
但是外界不能直接访问这个无参构造,我们怎样用这个对象呢??嗯没错我们可以写一个方法
把这个对象返回到外界,这个外界得到的对象就是唯一的对象,外界就能访问这个类的属性方法了
例如:
class program
{
static void Main(string[] args)
{
Sington.ReturnInstance().returnstring();
}
}
class Sington
{
private static Sington sington;
//无参构造私有化
private Sington()
{
}
//把这个对象返回到外界供外界访问
public static Sington ReturnInstance() {
sington =new Sington();
return sington;
}
public void returnstring()
{
Console.WriteLine("我是单例模式");
}
}
}
结果:我是单例模式
总结一下把: 关于上面提到的反射,线程问题。在实际开发中线程用的并不是很多(以我现在的理解)游戏开发中线程用到比较多,实际开发中反射用的还是比较多呢,为什么这样说呢?
因为很对框架底层都用到反射了,比如EF框架 我们用MVC+EF框架的时候,在视图页面利用
foreach (var item in collections)
{
显示的字段
}
这个里面就是用到反射了
反射的概念:就是程序运行时可以利用反射技术可以获取类相关信息动态执行一些方法
属性等
namespace 单例模式
{
class program
{
static void Main(string[] args)
{
sington s = new sington();
s.returnstring();
}
}
class sington
{
public sington()
{
}
public void returnstring()
{
Console.WriteLine("我是单例模式");
}
}
}
分析: 普通的类和系统的类我们实例化的时候是利用类里面的无参构造函数,如果没有无参构造类没有办法实例化 有的人可能会问,我们自定义类的时候没有写无参构造函数时 也可以进行实例化啊,你怎么会说没有无参构造函数不能进行实例化,其实原理是这样的,当我们自定义一个类的时候不写无参构造函数,这时候我们在进行实例化的时候系统会为我们写一个无参构造函数,如果我们在写类的时候显示写出无参构造函数,系统就不会为我们在提供一个默认的无参构造函数。
(扩展:其实利用无参构造函数实例化,原理是因为反射, 反射必须要有无参构造函数,EF框架原理也用到反射了,这些知识你们可以了解下)
上面的例子是普通的类进行实例化,这样写不能保证一个类只能产生一个对象,我们可以实例化很多对象比如: sington s = new sington();
sington d = new sington();
sington f = new sington();
这样写就有多个对象,多个对象有时候不能保证线程安全。
下面我们分析怎样才能产生一个对象呢???
根据上面的分析我们知道一个类产生多个对象的原因是因为外界可以操作这个对象,在外界就把这个对象实例化出多个,怎样才能避免外部直接访问这个对象的实例呢?? 外界实例化对象是因为类里面有个公开的无参构造,外界利用这个公开的无参构造可以实例化多个对象,那么我们把这个无参构造不让外界访问不就行了吗?? 有的同学可能想到了,对没错就是把访问权限public改成private 这样我们就能实现外界无法直接操作这个无参构造 也就说明 外界不能直接进行实例化了?
但是外界不能直接访问这个无参构造,我们怎样用这个对象呢??嗯没错我们可以写一个方法
把这个对象返回到外界,这个外界得到的对象就是唯一的对象,外界就能访问这个类的属性方法了
例如:
class program
{
static void Main(string[] args)
{
Sington.ReturnInstance().returnstring();
}
}
class Sington
{
private static Sington sington;
//无参构造私有化
private Sington()
{
}
//把这个对象返回到外界供外界访问
public static Sington ReturnInstance() {
sington =new Sington();
return sington;
}
public void returnstring()
{
Console.WriteLine("我是单例模式");
}
}
}
结果:我是单例模式
总结一下把: 关于上面提到的反射,线程问题。在实际开发中线程用的并不是很多(以我现在的理解)游戏开发中线程用到比较多,实际开发中反射用的还是比较多呢,为什么这样说呢?
因为很对框架底层都用到反射了,比如EF框架 我们用MVC+EF框架的时候,在视图页面利用
foreach (var item in collections)
{
显示的字段
}
这个里面就是用到反射了
反射的概念:就是程序运行时可以利用反射技术可以获取类相关信息动态执行一些方法
属性等