zoukankan      html  css  js  c++  java
  • DOTA版设计模式——单件模式

    单件模式,单件意味着唯一,我们创建的类的实例是唯一的。唯一的处理打印机,消息队列,注册表等等.......
    UML图:

    单件模式看来简单,其实不然。包括什么双重加锁(多线程要求),延迟实例化等等,具体在TerryLee的blog上有详细的描述,本文不再罗嗦。
    单件模式没有公开的构造函数,要实现对象的实例化只能依靠静态的GetInstance方法。在GetInstance方法中判断对象是否存在,存在则返回该对象,不存在就实例化一个对象返回。
    Dota中时间是唯一的,以下的例子是对白天黑夜的控制,也就是我们的夜魔技能。
    测试代码:
                DotaPatternLibrary.Singleton.GameTime gtObj = DotaPatternLibrary.Singleton.GameTime.GetInstance();
                LandpyForm.Form.OutputResult("Game时间类型:" + gtObj.TimeType);
                Thread balanarGamerThread = new Thread(new ThreadStart(BalanarDarkTime));
                Thread akashaGamerThread = new Thread(new ThreadStart(AkashaGetTimeType));
                balanarGamerThread.Start();
                akashaGamerThread.Start();
    /// <summary>
            
    /// 暗夜魔王放大
            
    /// </summary>
            public void BalanarDarkTime()
            {
                LandpyForm.Form.OutputResult(
    "夜魔(Balanar)大招");
                DotaPatternLibrary.Singleton.GameTime gtObj 
    = DotaPatternLibrary.Singleton.GameTime.GetInstance();
                gtObj.TimeType 
    = DotaPatternLibrary.Singleton.TimeTypeValue.Evening;
                
    for (int i = 1; i < 5; i++)
                {
                    Thread.Sleep(
    2000);
                    LandpyForm.Form.OutputResult(
    "时间过去" + i * 2 + "");
                }
                LandpyForm.Form.OutputResult(
    "夜魔(Balanar)大招时间到");
                DotaPatternLibrary.Singleton.GameTime gtObjNew 
    = DotaPatternLibrary.Singleton.GameTime.GetInstance();
                gtObjNew.TimeType 
    = DotaPatternLibrary.Singleton.TimeTypeValue.DayTime;
            }

            
    /// <summary>
            
    /// 痛苦女王获得时间类型
            
    /// </summary>
            public void AkashaGetTimeType()
            {
                
    for (int i = 1; i < 4; i++)
                {
                    Thread.Sleep(
    2000);
                    DotaPatternLibrary.Singleton.GameTime gtObj 
    = DotaPatternLibrary.Singleton.GameTime.GetInstance();
                    LandpyForm.Form.OutputResult(
    "痛苦女王(Akasha)获得时间:" + gtObj.TimeType);
                    Thread.Sleep(
    3000);
                }
            }

    完整代码:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using DotaPatternLibrary.Attribute;

    namespace DotaPatternLibrary.Singleton
    {
        
    class Singleton
        {
            
    public static object lockObj = new object();
            
    private static Singleton singleton;

            
    private Singleton()
            {
            }

            
    public static Singleton GetInstance()
            {
                
    lock (lockObj)
                {
                    
    if (singleton == null)
                    {
                        singleton 
    = new Singleton();
                    }
                }
                
    return singleton;
            }
        }

        
    public class TimeTypeValue
        {
            
    public const string DayTime = "DayTime(白天)";
            
    public const string Evening = "Evening(夜晚)";
        }

        
    public class GameTime
        {
            
    private static object lockObj = new object();
            
    private static GameTime gameTime;
            
    private string _timeType;

            
    public string TimeType
            {
                
    get { return _timeType; }
                
    set { _timeType = value; }
            }

            
    private GameTime()
            {
                
    this._timeType = TimeTypeValue.DayTime;
            }

            
    public static GameTime GetInstance()
            {
                
    lock (lockObj)
                {
                    
    if (gameTime == null)
                    {
                        gameTime 
    = new GameTime();
                    }
                }
                
    return gameTime;
            }
        }
    }
  • 相关阅读:
    循环
    rugarch包与R语言中的garch族模型
    Logistic回归
    机器学习缺失值处理方法汇总
    pandas库介绍之DataFrame基本操作
    python中常用的九种预处理方法
    谁动了我的特征?——sklearn特征转换行为全记录
    使用sklearn优雅地进行数据挖掘
    使用sklearn做单机特征工程
    彻底解决matplotlib中文乱码问题
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1531585.html
Copyright © 2011-2022 走看看