HeadFirst设计模式--单例模式

单例模式

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

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

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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值