雪花

六、单列模式-简单案例

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就是类
            }
        }

    }


}

  

 

  

posted @ 2019-03-21 18:08  十色  阅读(169)  评论(0编辑  收藏  举报