首页 > 其他分享 >单例模式类为什么需要用sealed关键字修饰?

单例模式类为什么需要用sealed关键字修饰?

时间:2023-01-18 22:22:20浏览次数:39  
标签:单例 private 关键字 static sealed GuidService public guidService

使用单例设计模式,需要确保在任何给定的时间点对于整个应用程序只有一个特定类的实例可用。使用私有构造函数,可以避免类在外部被实例化,但是却无法避免内部类(嵌套类)的继承,如下:

public class GuidService
{
    private static int counter = 0;
    private static GuidService? _guidService = null;
    public static GuidService GetGuidService
    {
        get
        {
            if (_guidService == null)
                _guidService = new GuidService();
            return _guidService;
        }
    }

    private GuidService()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    public void PrintDetails(string message)
    {
        Console.WriteLine(message);
    }

GuidService里边定义了私有构造函数,此时如果外部类继承GuidService就会报错,“GuidService.GuidService()”不可访问,因为它具有一定的保护级别,但是却可以使用内部类继承GuidService,如下:

public class GuidService
{
    private static int counter = 0;
    private static GuidService? _guidService = null;
    public static GuidService GetGuidService
    {
        get
        {
            if (_guidService == null)
                _guidService = new GuidService();
            return _guidService;
        }
    }

    private GuidService()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }
    public void PrintDetails(string message)
    {
        Console.WriteLine(message);
    }
    public class SubGuidService : GuidService
    {

    }
}

调用:

using DesignDemo;

GuidService guidService1 = GuidService.GetGuidService;
guidService1.PrintDetails("guidService1");
GuidService guidService2 = GuidService.GetGuidService;
guidService2.PrintDetails("guidService2");

GuidService.SubGuidService subGuidService = new GuidService.SubGuidService();
subGuidService.PrintDetails("subGuidService");
Console.ReadKey();

输出:

Counter Value 1
guidService1
guidService2
Counter Value 2
subGuidService

上面的输出清楚地显示计数器值已经增加到2,这证明私有构造函数执行了两次,因此它创建了单例类的多个实例。因此,通过删除密封关键字,我们可以继承单例类,也可以创建单例类的多个对象。这违反了单例设计原则。所以,将GuidService类用sealed修饰,如下:

public sealed class GuidService{
    
}

这时,内部类继承GuidService就会报错,“GuidService.SubGuidService”: 无法从密封类型“GuidService”派生。因此,从这一点出发,我们得出结论,c#中的私有构造函数只能帮助我们防止类的任何外部实例化,而密封关键字将防止类继承。
另外,上面的实现方式是非线程安全的。GuidService类允许两个不同的线程同时进行测试 if(instance = = null) 并且发现它为true,它们都创建了实例,这依旧违反了单例设计模式原则。

标签:单例,private,关键字,static,sealed,GuidService,public,guidService
From: https://www.cnblogs.com/dcy521/p/17060757.html

相关文章

  • 设计模式:单例模式
    最近谷咕咕在学习设计模式,都说不会设计模式的程序员是读不懂框架源码的,而且写出的代码是架构底下的。行吧,那只好卷一下,看看各个设计模式的优点。这里先是看了狂神的视频,然......
  • 单例模式
    单例模式1、概述核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点常见场景:Window的任务管理器Window的回收站项目中,读取配置文件的类,一般......
  • 设计模式之单例模式
    一、什么是单例模式?单例设计模式属于创建型模式范畴,所以主要用于处理对象创建和操作,当我们需要确保只创建一个特定类的实例,然后为整个应用程序提供对该实例的简单全局访问......
  • 手写笔记20:获取父类的类名 & super与this的区别 & 关键字
    ......
  • SQLServer中常用关键字
    SQL中建库,建表--1.创建一个数据库createdatabaseSchool;--删除数据库dropdatabaseSchool;--创建数据库的时候指定一些选项。createdatabaseSchoolonprimary......
  • CREATE TRIGGER时NEW和OLD是关键字
    SQLite触发器-菜鸟教程(runoob.com)CREATETRIGGER-sqlite.orgBoththeWHENclauseandthetriggeractionsmayaccesselementsoftherowbeinginserted,d......
  • js-export关键字介绍
    在JavaScript中,export语句中被使用在一个模块中,去export,functions,objects,或者私有的value,所以我们可以在另外一个程序中使用这些,使用import语句。模块将......
  • Java基础02 关键字与标识符
    关键字与标识符关键字随着不断深入学习Java逐渐理解和掌握标识符定义Java中所有的组成部分都需要名字,类名,变量名,各种方法名都称为标识符命名首字母:a-z;A-......
  • flex 3 combobox 实现关键字过滤搜索-代码示例
    <?xmlversion="1.0"encoding="utf-8"?><s:Applicationxmlns:fx="http://ns.adobe.com/mxml/2009"xmlns:s="library://ns.adobe.com/flex/spark"xmlns:mx="......
  • docker-compose 关键字:depends_on 不检查ready装填,未按启动顺序执行的问题
    标题:docker-compose关键字:depends_on不检查ready装填,未按启动顺序执行的问题示例代码:version:'3'networks:web_network:driver:bridgenginx_network:......