1. 程式人生 > >六、單列模式

六、單列模式

public exc HERE 類型 doc light object resolv cti

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Common;
using Microsoft.AspNetCore.Mvc;


namespace OTA.Controllers
{
    public class IndexController : Controller
    {
        public IActionResult Index()
        {

            Common.G<H>.Resolve.h();

            string s=Common.G<H>.Resolve.hh();

            ViewBag.Message = s;

            return View();

        }

    }

    // 調用的方法。
    public class H
    {
        public void h()
        {
            //return 2;
            Console.WriteLine("H2");
        }

        public string hh()
        {

            return "GG2";
        }

    }

}

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <h3>@ViewBag.Message</h3>
</body>
</html>

  

單列封裝的類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//UnitOfWork
namespace Common
{

    //四、特例    這個實現不需要指定一個類
    public class UnitOfWork    //2、點列類加一個封裝
    {
        private Dictionary<Type, Lazy<object>> Services { get; set; }

        private UnitOfWork()//構造函數 的時候new 一個Server 鍵值集合
        {
            Services = new Dictionary<Type, Lazy<object>>();
        }

        //單列模式-懶漢模式
        static UnitOfWork instance;  //或者  static F instance=null 寫法
        static object locker = new object();  //返回對象實例用到的鎖
        private static UnitOfWork Instance   //通過屬性方式返回對象實例
        {
            get
            {
                lock (locker)
                {
                    if (instance == null)
                        instance = new UnitOfWork();
                    return instance;
                }
            }
        }
        public static T Resolve<T>() where T : new()//不過它調用的是這個  即定義公有方法提供一個全局訪問點,同時你也可以定義公有屬性來提供全局訪問點
        {
            Lazy<object> service;
            if (Instance.Services.TryGetValue(typeof(T), out service))
            {
                return (T)service.Value;
            }
            else
            {
                Instance.Services[typeof(T)] = new Lazy<object>(() => new T());
                return Resolve<T>();
                //throw new KeyNotFoundException(string.Format("Service not found for type ‘{0}‘", typeof(T)));
            }
        }

    }

    // 1、封裝單列類的,這樣單列類就不會對外公開使用了
    public static class G<T> where T : new() //使用的時候可以指定類型,這樣就可以在類內使用    要求:  G類必須Status 且<T>泛型   好像加不加都行 為什麽
    {
        public static void g()
        {
            Console.WriteLine("封裝的外部類");
        }
        public static T Resolve  //單列不一定是返回自己,也可能返回其他的對象,這個“單”說的就是返回的對象永遠的一個
        {
            get
            {
                return UnitOfWork.Resolve<T>();//這裏的T就是類
            }
        }

    }


}

  

  

六、單列模式