单例模式
一、为什么要用单例模式?
假如有多个用户同时登录,那么在这个时刻,通过计数器取到的在线人数是相同的,于是他们使用各自的计数器加1后存入
文件或者数据库。这样操作后续登陆的用户得到的在线人数,与实际的在线人数并不一致。所以,把这个计数器设计为一
个全局对象,所有人都共用同一份数据,就可以避免类似的问题,这就是我们所说的单例模式的其中的一种应用。
单例模式主要有3个特点:
1、单例类确保自己只有一个实例。
2、单例类必须自己创建自己的实例。
3、单例类必须为其他对象提供唯一的实例。
下面的代码示例,就是使用单例模式实现计数功能的代码,有问题,欢迎指出。
二、代码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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++;
}
}
}
namespace 时间倒数.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
var sig=Sigleton.GetSigleton();
ViewBag.Count = sig.GetCount();
return View();
}
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@{
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>
三、注意的地方。
HTML页面里面有倒数计时的功能,这个不用管,是我自己测试时写的。只需要看那个计数即可。单例里面也要注意那个判断是否为空的地方,我也是刚学,以这种双重判断是否为空会比较安全,太深的含义,我还不知道。