单例模式
我们首先提出的疑问是什么是单例模式,为什么需要单例模式?
比如有的时候我们对一些对象只用一个,比如线程池。缓存等等。如何保障一个实例的运行呢?
或许我们可以使用全局变量,不过全局变量只能提供全局访问,不能确保只有一个实例。全局变量一旦多了,通常有的时候我们自己都忘记了。这点深有感触。看代码的时候也是特别的费劲。
单例模式确保一个类只有一个实例,并提供一个全局访问点。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Singleton
{
class Program
{
static void Main(string[] args)
{
Singleton singleton = Singleton.getInstance();
singleton.display();
Singleton1 second = Singleton1.getInstance();
second.display();
Console.ReadLine();
}
}
class Singleton
{
private static Singleton uniqueInstance;
private Singleton() { }
public static Singleton getInstance()
{
if (uniqueInstance==null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
public void display()
{
Console.WriteLine("这是单例模式");
}
}
//但是上面的方式有没有问题呢?
//如果多线程的情况下,那么就会同时进入到getInstance函数中,同样还是会创建两个实例。
/// <summary>
/// 这种方式也为“饿汉”模式,在声明类的时候就创建对象。
/// </summary>
class Singleton1
{
private static Singleton1 uniqueInstance = new Singleton1();
private Singleton1() { }
public static Singleton1 getInstance()
{
return uniqueInstance;
}
public void display()
{
Console.WriteLine("饿汉模式单例");
}
}
}
//要说明的是,利用单例模式,它的构造函数就必须为私有的,那么私有的构造函数主要作用是??
//还有为什么使用静态的就能够确保只有一个实例了呢?
小结:要说明的是,利用单例模式,它的构造函数就必须为私有的。几个知识点的回顾
静态变量:在类中,用关键字static声明的为静态的,特点为:
1、在内存中仅占有一块内存。静态成员是属于整个类的,而不是属于某一个具体的类。
2、其中私有的静态成员函数不能被类外部函数和对象访问。
3、在编译时创建并初始化,也就是在类的任何对象被建立之前就存在。有static修饰的就是在编译时就被分配了内存,如Main函数
那么如果类中只有私有构造函数,则其它类无法创建该对象的实例。声明空的构造函数为了防止系统调用默认的构造函数。因此在上述代码中,只有通过getInstance这个函数才能够获得这个对象的唯一实例uniqueInstance。