HeadFirst设计模式--单例模式

来源:互联网 发布:mac虚拟机文件共享 编辑:程序博客网 时间:2024/05/21 10:42

单例模式

我们首先提出的疑问是什么是单例模式,为什么需要单例模式?

比如有的时候我们对一些对象只用一个,比如线程池。缓存等等。如何保障一个实例的运行呢?

或许我们可以使用全局变量,不过全局变量只能提供全局访问,不能确保只有一个实例。全局变量一旦多了,通常有的时候我们自己都忘记了。这点深有感触。看代码的时候也是特别的费劲。

单例模式确保一个类只有一个实例,并提供一个全局访问点。

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


0 0
原创粉丝点击