首页 > 其他分享 >设计模式--单例模式

设计模式--单例模式

时间:2024-08-27 23:15:25浏览次数:7  
标签:Singleton IRace -- SingletonSecond static 单例 new 设计模式 public

1.单例模式:关注于对象的创建。分为懒汉式和饿汉式。

懒汉式:调用方法的时候才创建;

class Singleton
    {
        private Singleton() //1.私有构造方法
        {
            Console.WriteLine("构造方法被创建");
            
        }
        private static volatile Singleton _Singleton = null;//3.全局唯一静态,重用这个变量
        private static object Singleton_Lock = new object();

        public static Singleton CreateInstance()//2.公开的静态方法提供对象实例
        {
            if(_Singleton == null)//4.多线程,双判断加锁
            {
                lock (Singleton_Lock)
                {
                    if (_Singleton == null)
                    {
                        _Singleton = new Singleton();
                    }
                }
            }
            return _Singleton;
        }
        public int iTotal = 0;
        internal void Show()
        {
            iTotal++;
        }
    }

饿汉式1:静态构造函数中创建,一开始就创建

class SingletonSecond
    {
        private SingletonSecond()
        {
        }
        static SingletonSecond()
        {
            _SingletonSecond = new SingletonSecond();
        }
        public static SingletonSecond _SingletonSecond = null;
        public SingletonSecond CreateInstance()
        {
            return _SingletonSecond;
        }
        /// <summary>
        /// 原型模式--主要用于克隆的方式比创建快的场景
        /// </summary>
        /// <returns></returns>
        public static SingletonSecond CreateInstancePrototype()
        {
            SingletonSecond second = (SingletonSecond)_SingletonSecond.MemberwiseClone();
            return second;
        }
    }

饿汉式2:使用静态字段创建对象

class SingletonThird
    {
        private SingletonThird()
        {

        }
        /// <summary>
        /// 静态字段:在第一次使用这个类之前,初始化且只初始化一次
        /// 这个比构造函数还早
        /// </summary>
        public static SingletonThird _SingletonThird = new SingletonThird();
        public static SingletonThird CreateInstance()
        {
            return _SingletonThird;
        }
    }

2.三大工厂:简单工厂、工厂方法、抽象工厂

一.简单工厂:把创建对象的过程封装成工厂。

//想去细节,想去掉什么,封装一下
                IRace race = ObjectFactory.CreateRace(RaceType.Human);
                IRace race = ObjectFactory.CreateRaceConfig();
                IRace race = ObjectFactory.CreateRaceConfigReflection();
class ObjectFactory
    {
        public static IRace CreateRace(RaceType raceType)
        {
            IRace iRace = null;
            switch (raceType)
            {
                case RaceType.Human:
                    iRace = new Human();
                    break;
                case RaceType.NE:
                    iRace = new NE();
                    break;
                case RaceType.ORC:
                    iRace = new ORC();
                    break;
                case RaceType.Undead:
                    iRace = new Undead();
                    break;

                default:
                    break;
            }
            return iRace;
        }

        public static IRace CreateRaceConfig()
        {
            string IRaceTypeConfig = "";
            RaceType raceType = (RaceType)Enum.Parse(typeof(RaceType), IRaceTypeConfig);
            return CreateRace(raceType);
        }

        public static IRace CreateRaceConfigReflection()
        {
            Assembly assembly = Assembly.Load("");
            Type type = assembly.GetType("");
            IRace iRace = Activator.CreateInstance(type) as IRace;
            return iRace;
        }
    }

二.工厂方法:每个工厂只负责一个对象的创建(建造者模式:是为了创建一个更复杂的对象)

          IFactory factory = new HumanFactory();
                IRace race = factory.CreateRace();

     这样做的好处是:可以增加创建逻辑,屏蔽对象实例化的复杂度,对象创建的过程中,可以扩展(尤其式IOC)

public class HumanFactory : IFactory
    {
        public virtual IRace CreateRace()
        {
       console.write("增加的创建逻辑") return new Human(); } public class HumanFactoryAdvanced : HumanFactory //可扩展体现在此处 { public override IRace CreateRace() { Console.WriteLine("123"); return new Human(); } } }

三.抽象工厂:一个工厂负责产品簇的创建:

class HumanFactory : FactoryAbstract
    {
        public override IArmy CreateArmy()
        {
            throw new NotImplementedException();
        }

        public override IHero CreateHero()
        {
            throw new NotImplementedException();
        }

        public override IRace CreateRace()
        {
            throw new NotImplementedException();
        }

        public override IResource CreateResource()
        {
            throw new NotImplementedException();
        }
    }

 

标签:Singleton,IRace,--,SingletonSecond,static,单例,new,设计模式,public
From: https://www.cnblogs.com/guoxu486/p/18383722

相关文章

  • Datawhale X 李宏毅苹果书AI夏令营 Task1打卡
    3.1局部极小值与鞍点3.1.1临界点及其分类参数对于损失函数的微分为零时,就无法进一步优化了,训练即停止了。所以我们把这些梯度为零的点统称为临界点。临界点可以分为两类:极值点(局部极小值)和鞍点。鞍点就是指那些梯度为零但不是局部极小值或者局部极大值的点,因为其在损失......
  • 纪念第一次在 Github 上提 ISSUE 得到了老哥的回复
    背景第一次在GitHub上提ISSUE,提问的内容就是我的上一篇博文rustlingsv6.0运行时出现“YouaretryingtorunRustlingsusingtheoldmethodbeforeversion6”,当时搞了好长时间都没思绪,然后就抱着试一试的心态在上面提了一个ISSUE。提问之后,又慢慢理了一下思路,终于......
  • sky-take-out chapter 5
    微信登录商品浏览HttpClient(1)介绍就是一个客户端编程工具包,更直白点就是我们可以在java程序中通过HttpClient这个工具包来构造http请求,并且可以来发送http请求;要使用httpclient就需要再java程序中导入maven坐标。核心API:HttpClient实际上是一个接口,使用它可以来发送一个h......
  • CF1810G The Maximum Prefix 题解
    Description构造一个长度最多为\(n\)的数组\(a\),其每个元素均为\(1\)或\(-1\)。生成方式如下:选择任意整数\(k\in[1,n]\)作为\(a\)的长度。对于\(\foralli\in[1,k]\),有\(p_i\)的概率设\(a_i=1\),有\(1-p_i\)的概率设\(a_i=-1\)。在数列被生成后,计算\(s_i=a......
  • 2024-08-27 闲话
    用户行为建模是一个非常非常有趣的事情。从这六个字,你就可以联想到,我点点这里划划那里,你怎么就能知道我在干什么呢?今天突然想到除了user的action之外,我们其实还有屏幕的显示信息。今天读到一篇文章,讲IdentifyingUserGoalsfromUITrajectories。这个名字一下子就激起了我......
  • pytorch常见错误_0240826
    pytorch常见错误RuntimeError:aleafVariablethatrequiresgradisbeingusedinanin-placeoperation.如下程序会抱上述错误x=torch.randn(3,requires_grad=True)x+=1#原位操作报错:RuntimeError:aleafVariablethatrequiresgradisbeingusedinan......
  • 如果让现在的部分主流 LLM 模型做 SCP-S?(个人补充)
    ChatGLM(58.5分)个人认为比较厉害但是没有被cz评测,部分试题打开联网。一、单项选择题(24分)T1(3分)在CSP-S第二轮评测中,用于编译题目英文名为luogu的传统型试题的选手代码的编译命令是B.g++-std=c++14-O2-oluogu.cpp。这个命令使用了C++编译器g++,并指定了C++14......
  • 个人介绍&软工5问
    这个作业属于哪个课程22级计科12班这个作业要求在哪里作业要求这个作业的目标熟悉博客,Github,熟练使用Markdown自我介绍1.我叫林诗淇,是22级计算机科学与技术2班的学生2.平时喜欢各种体育运动,喜欢听音乐,偶尔看看书,喜欢玩CS2和LOL3.目前有自己的学习方向,也正在......
  • centos 7.6 上安装redis
    ============================CenteOs7上安装Redis redis-3.2.12-2.el7.x86_64安装前先检查安装环境首先检查gcc环境。gcc-v如果没有安装,那么就安装gcc等环境。sudoyuminstallgcc-c++make-y开始安装下载fedora的epel仓库yuminstallepel-release安装redis数据库yum......
  • 【python】基础之生成器
    1.什么是生成器?是Python中一种特殊的迭代器,它是一个能按需生成值的轻量级对象。与一次性创建所有元素的数据结构(如列表或元组)不同,生成器在每次迭代时只生成下一个值,从而节省内存并支持无限序列或其他大量数据流的操作。#iter中简单是4行代码,可以代替MyRangeIterator一样的......