🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page

Was this helpful?

  1. Паттерны
  2. Порождающие паттерны
  3. Одиночка

Возможные реализации для решения конкретных задач на С++

Singleton

Шаблон одиночка (Singleton)

template <typename T>
concept NotAbstractClass = is_class_v<T> && !is_abstract_v<T>;


template <typename T>
concept CopyConstructible = requires(T t)
{
	T(t);
};


template <typename T>
concept Assignable = requires(T t1, T t2)
{
	t1 = t2;
};


template <typename T>
concept OnlyObject = NotAbstractClass<T> && !CopyConstructible<T> && !Assignable<T>;
template <OnlyObject Type>
class Singleton
{
private:
	static unique_ptr<Type> inst;

public:
	template <typename... Args>
	static Type& instance(Args&& ...args)
	{
		struct Proxy : public Type
		{
			Proxy(Args&& ...args) : Type(forward<Args>(args)...) {}
		};

		if (!inst)
			inst = make_unique<Proxy>(forward<Args>(args)...);

		return *inst;
	}

	Singleton() = delete;
	Singleton(const Singleton&) = delete;
	Singleton<Type>& operator =(const Singleton&) = delete;
};

template <OnlyObject Type>
unique_ptr<Type> Singleton<Type>::inst{};
class Sun
{
private:
	int age;
	double brightness;

protected:
	Sun() = default;
	Sun(int n, double d) : age(n), brightness(d)
	{
		cout << "Calling the constructor;" << endl;
	}

public:
	~Sun() 
	{ 
		cout << "Calling the destructor;" << endl; 
	}

	void f() 
	{ 
		cout << "age = " << age << "; brightness = " << brightness << endl; 
	}

	Sun(const Sun&) = delete;
	Sun& operator =(const Sun&) = delete;
};
# include <iostream>
# include <memory>

using namespace std;

int main()
{
	decltype(auto) d1 = Singleton<Sun>::instance(1, 2.);
	decltype(auto) d2 = Singleton<Sun>::instance();

	d2.f();
}
PreviousРеализации на KotlinNextПул объектов

Last updated 1 year ago

Was this helpful?