SignlethonWithParams.cs

57 lines | 1.771 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tools.SingletonTool
{

    //Класс выступающий в роли SinglCreate должен реализовать данный интерфейс
    public interface ISignlethonWithParams<in P>
    {
        //Аналогичен конструктору с параметром для синглтона        
        void SetParams(P param);
    }

    /// <summary>
    /// Перед обращениями необходимо создать экземпляр
    /// вызовом метода Create
    /// Позволяет передавать параметры при создании
    /// </summary>
    /// <typeparam name="T">Тип singleton</typeparam>
    /// <typeparam name="P">Параметр для конструктора объекта T</typeparam>
    public static class SignlethonWithParams<T, P>
        where T : ISignlethonWithParams<P>, new()
    {
        //Экземпляр синглтон
        private static T single;

        //Создан ли экземпляр
        public static bool ExistInstance => single != null;


        //Создает экземпляр
        public static T Create(P p)
        {
            if (ExistInstance)
                throw new Exception("SinglCreate.Create | Singlethon instance already exist");

            single = new T();
            single.SetParams(p);

            return single;
        }

        //Метод доступа к синглтону
        public static T Get()
        {
            if (!ExistInstance)
                throw new Exception("SinglCreate.Get() | Singlethon not create. Use Create(p)");

            return single;
        }

    }
}