单例模式

一、为什么要用单例模式? 

  假如有多个用户同时登录,那么在这个时刻,通过计数器取到的在线人数是相同的,于是他们使用各自的计数器加1后存入
文件或者数据库。这样操作后续登陆的用户得到的在线人数,与实际的在线人数并不一致。所以,把这个计数器设计为一
个全局对象,所有人都共用同一份数据,就可以避免类似的问题,这就是我们所说的单例模式的其中的一种应用。
  单例模式主要有3个特点:
  1、单例类确保自己只有一个实例。
  2、单例类必须自己创建自己的实例。
  3、单例类必须为其他对象提供唯一的实例。

  下面的代码示例,就是使用单例模式实现计数功能的代码,有问题,欢迎指出。

 

二、代码。

namespace 时间倒数
{
    public class Sigleton
    {
        private readonly static object obj = new object();

        private static Sigleton sig = null;


        private static Sigleton Sigle
        {
            get
            {
                if (sig == null)
                {
                    lock (obj)
                    {
                        if (sig == null)
                        {
                            sig = new Sigleton();
                        }
                    }
                }
                return sig;
            }
        }

        private static int Count = 1;

        public static Sigleton GetSigleton()
        {
            return Sigle;
        }

        public int GetCount()
        { 
            return Count++;
        }
    }
}
View Code
namespace 时间倒数.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            var sig=Sigleton.GetSigleton();
            ViewBag.Count = sig.GetCount();
            return View();
        }

    }
}
@{
    ViewBag.Title = "Index";
}
<style>
    .daojishi h2 {
        font-family: Helvetica, Microsoft YaHei, Arial, sans-serif;
        font-size: 14px;
        margin-bottom: 5px;
        color: #151515;
    }

    .daojishi #timer {
        font-family: Helvetica, Microsoft YaHei, Arial, sans-serif;
        font-size: 14px;
        color: #151515;
        font-weight: bold;
    }
</style>
<body onload="timer()">
    <div class="daojishi">
        <h2>剩余时间为:</h2>
        <div id="timer">
            <span id="days"></span><span></span>
            <span id="hours"></span><span></span>
            <span id="minute"></span><span></span>
            <span id="seconds"></span><span></span>
        </div>
    </div>
    <div>
        <span>访问人数:</span><span>@ViewBag.Count</span>
    </div>
</body>

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script>
    var nowts;
    //计算相差的月数
    var leave;
    var months;
    //计算出相差天数
    var leave0;
    var days;
    //var days = Math.floor(nowts / (24 * 3600 * 1000));
    //计算出小时数
    var leave1;     //计算天数后剩余的毫秒数
    var hours;
    //计算相差分钟数
    var leave2;         //计算小时数后剩余的毫秒数
    var minutes;
    //计算相差秒数
    var leave3;       //计算分钟数后剩余的毫秒数
    var seconds;
    function timer() {
        nowts = (new Date(2016, 8, 6, 7, 0, 0)) - (new Date()); //计算剩余的毫秒数
        
        showTime(nowts);
        setInterval("nowTimeOver()", 1000);
    }
    function nowTimeOver() {
        nowts = nowts - 1000;
        showTime(nowts);
    }
    function showTime(ts) {
        
        //计算相差的月数
        leave = nowts % (12 * 30 * 24 * 3600 * 1000);
        months = Math.floor(leave / (30 * 24 * 3600 * 1000));
        //计算出相差天数
        leave0 = leave % (31 * 24 * 3600 * 1000);
        days = Math.floor(leave0 / (24 * 3600 * 1000));
        //var days = Math.floor(nowts / (24 * 3600 * 1000));
        //计算出小时数
        leave1 = leave0 % (24 * 3600 * 1000);     //计算天数后剩余的毫秒数
        hours = Math.floor(leave1 / (3600 * 1000));
        //计算相差分钟数
        leave2 = leave1 % (3600 * 1000);         //计算小时数后剩余的毫秒数
        minutes = Math.floor(leave2 / (60 * 1000));
        //计算相差秒数
        leave3 = leave2 % (60 * 1000);       //计算分钟数后剩余的毫秒数
        seconds = Math.round(leave3 / 1000);
        document.getElementById("timer").innerHTML = checkTime(days) + "" + checkTime(hours) + "" + checkTime(minutes) + "" + checkTime(seconds) + "";
        
    }
    function checkTime(i) {
        if (i < 10) {
            i = "0" + i;
        }
        return i;
    }

</script>
View Code

 

三、注意的地方。

  HTML页面里面有倒数计时的功能,这个不用管,是我自己测试时写的。只需要看那个计数即可。单例里面也要注意那个判断是否为空的地方,我也是刚学,以这种双重判断是否为空会比较安全,太深的含义,我还不知道。

posted @ 2016-07-26 15:11  月下之神  阅读(246)  评论(0编辑  收藏  举报