синглтон что это такое
«Я — синглтон». Почему людям для счастья больше не нужны отношения
Одиночество сегодня не вынужденное состояние, а выбор многих миллионов людей, которые вместе формируют новое, более сознательное общество, влияют на мировую экономику, развитие интернет-технологий и градостроительные процессы. Число одиночек растет. Они становятся ответственнее, успешнее, интереснее, и им плевать на то, что о них думают другие.
В прошлом
В крупных городах России дух перемен, воспетый русскими авангардистами, и социальные последствия революции привели к пертурбациям в семейной сфере. Традиционное супружество вытесняет новая форма внебрачных отношений — сожительство, увеличивается число разводов, процветает свободная любовь. Остро стоит квартирный вопрос, люди ютятся в коммуналках — иметь семью теперь экономически невыгодно.
Ровно век спустя мы снова становимся свидетелями социальных процессов, способствующих переоценке «преимуществ» семейной жизни, всегда считавшихся очевидными. В ближайшие годы женатые люди могут оказаться в меньшинстве — пришло время одиночек.
Статистика
«В наши дни одинокими являются более 50 % взрослых американцев; 31 млн человек… проживают в одиночестве.
…[В] Швеции, Дании, Норвегии и Финляндии — стран[ах], имеющих один из самых высоких уровней жизни… около 40 % домохозяйств состоит всего из одного человека.
…Во всём мире число людей, проживающих в одиночестве, резко увеличилось — со 153 млн в 1996 году до 201 млн в 2006 году, то есть за 10 лет количество таких людей возросло на 33 %».
По результатам последней переписи населения, в России 40 % населения имеют статус одиноких — никогда не состояли в браке (зарегистрированном или так называемом гражданском), вдовствуют или разведены. При этом, согласно данным опроса ВЦИОМ, 79 % россиян вовсе не чувствуют себя одиноко, а 54 % опрошенных отсутствие пары не пугает.
Современные одиночки
The Guy — Чувак — безымянный герой сериала High Maintenance, который третий сезон выходит на остросоциальном канале НВО, — пример современного одиночки, или «синглтона». Впервые это понятие использовал в 2012 году социолог, доктор философии Нью-Йоркского университета Эрик Кляйненберг.
Синглтоны — жители больших городов, которые непрочным семейным связям и сомнительным отношениям предпочитают одиночество.
Чувак, как и многие другие мужчины и женщины его поколения, ведет насыщенную социальную жизнь, успешен в своем деле, очевидно нравится людям — и у него нет пары.
Создатель сериала и исполнитель главной роли Бен Синклер говорит в интервью: «Вначале мы хотели, чтобы он чувствовал себя одиноко, а потом подумали: эй, а что, если с ним всё нормально?» Многочисленные исследования жизни синглтонов подтверждают: так оно и есть.
«В наши дни молодые одиночки, — пишет Кляйненберг, — стремятся активно „переформатировать“ представление о том, что их существование является показателем социального фиаско, в прямо противоположное — что оно свидетельствует о неординарности личности и об успехе. Инвестиции в себя необходимы потому, что современные семьи часто распадаются, работа не является стабильной, и в конечном счете каждый из нас может надеяться только на самого себя».
«Я вполне гармонично ощущаю себя в статусе одинокого человека и не понимаю людей, которые всеми силами пытаются его изменить. Если появляется подходящий человек — это другое дело. А до тех пор нужно наслаждаться жизнью и как можно круче раскрывать себя, а потом будет что и в детей вложить».
Наташа, 33 года, градостроительница
Сегодня всё реже используются такие эпитеты, как «холостяк», «старая дева», «разведенка». Очевидно, что семейный статус мужчины никак не сказывается на его способности к зачатию. Зато отцы, оказавшиеся в этой роли без особого желания, плохо с ней справляющиеся или вовсе ее отвергающие, склонны страдать от чувства вины и рискуют вызвать резкое осуждение в обществе.
«Многие считают, что я просто боюсь брать на себя ответственность за женщину и ребенка — оттого и не завожу семью. Но пока я не вполне понимаю, для чего мне это нужно. У меня остаются сомнения, что благодаря таким изменениям моя жизнь станет лучше. А идти на это из-за предрассудков о „правильной жизни“ и „мужском долге“ я, конечно, не буду!»
Евгений, 42 года, архитектор
В стране, где более половины браков заканчиваются разводами, пренебрежительное отношение к одиночкам и вовсе нелепо и становится моветоном. Тем не менее такие люди продолжают испытывать на себе социальное давление. Доктор философии Белла Депауло, которая сама всю жизнь обходится без пары, в своей книге говорит о дискриминации одиноких людей и даже вводит особый термин — «синглизм» (по аналогии с «расизмом» и «сексизмом»).
Проявлений синглизма множество — от упущений в законодательных актах до привычной пренебрежительной манеры общения с неженатыми людьми.
«Мама переживает по поводу моего одиночества. Да, это на меня влияет. Иногда я начинаю загоняться, хотя и понимаю, что зря».
Наталья, 37 лет, режиссер
Депауло утверждает: уровень счастья у семейных людей лишь немного выше, чем у одиноких, а по прошествии некоторого времени он снова достигает прежней отметки. Замужние женщины в той же мере подвержены стрессу, депрессии, так же часто чувствуют себя «покинутыми», как и те, что живут без «второй половинки»: «Одинокие люди не заслуживают пренебрежительного отношения к себе и дискриминации, такое поведение обусловлено стереотипами».
Главный страх
По утверждению Кляйненберга, острее всего одиночество переживают люди, которые недавно овдовели, особенно если после ухода супруга/супруги резко возрастает риск болезни, смерти или маячит пугающая перспектива переезда в дом престарелых.
По статистике, большинство пар в России распадается после 5–9 лет совместной жизни. Тех, кто подает на развод после 20 лет брака, тоже немало — 13 %. Выходит, сохранить отношения до самой смерти удается совсем немногим.
А что, если супруг, на которого возложена почетная миссия провожатого в мир иной, отправится туда раньше? Или, оказавшись на годы прикованным к постели, сам будет нуждаться в постоянном уходе? К тому же не каждому захочется в случае смертельного заболевания полностью зависеть от другого.
«Я привыкла сама о себе заботиться. Мысль о том, что в старости я стану для кого-то обузой, меня ужасает. Лучше я заранее побеспокоюсь о сиделке или месте в доме престарелых, чем позволю мужчине взять на себя эту роль».
Инга, 29 лет, издательница
Жизнь без секса хуже смерти
«Больше всего меня пугает отсутствие секса. Что такие периоды будут затягиваться. Но по своему опыту я знаю: не заниматься сексом, когда ты одна, не так мучительно, как когда ты живешь в браке, но секса всё равно нет».
Соня, 35 лет, писательница
По словам Кляйненберга, «жизнь в одиночестве дает несколько преимуществ: сексуальную свободу и пространство, где можно экспериментировать с этой свободой, возможность развиваться, расти и искать настоящую любовь». В то же время приведенные ученым статистические данные, как и результаты других исследований, свидетельствуют, что в жизни синглтонов бывают долгие периоды воздержания:
«Мужчины среднего возраста, снова вступившие в брак, имеют больше шансов жить половой жизнью, чем те, кто развелся, но остался один. 57 % мужчин, проживающих с партнером… заявили, что занимались сексом раз в неделю или больше… по сравнению с 43 % мужчин, проживающих без партнера. Одинокие мужчины мастурбируют в два раза чаще…
Для женщин сексуальных преимуществ в браке еще больше.
[Из тех, кто снова вступил в брак или стал жить с партнером] 54% [занимаются] сексом раз или более в неделю. [Тогда как среди разведенных женщин сексуально удовлетворенных было только 9 %]. Ответы женщин на вопрос о том, живут ли они в целибате, рисуют картину отчаяния: 17 % вновь вышедших замуж и 77 % разведенных и незамужних женщин заявили, что [вообще не ведут половой жизни]».
«В первое время после расставания отсутствие тактильных ощущений причиняет мне сильное физическое страдание. Кажется, я просто не выживу: как же так — не обниматься, спать одному? Постепенно боль затихает и ущерб от отсутствия контакта перестает быть разрушительным. Я как будто частично засыпаю, а остальные функции работают нормально».
Евгений, 42 года, архитектор
У одинокого человека, которого удручает отсутствие секса, есть масса возможностей изменить ситуацию — в то время как люди, связанные семейными узами, лишены такой привилегии.
Исследование, ставившее целью определить степень интегрированности одиночек в общественную жизнь, подтверждает: синглтоны имеют больше контактов с родственниками, соседями и друзьями, чем те, кто состоит в браке. «Есть все основания утверждать, что живущие в одиночестве люди компенсируют свое состояние повышенной социальной активностью, превышающей активность тех, кто проживает совместно, а в городах, где много одиночек, бурлит культурная жизнь».
В большом городе
«Становясь всё более популярным, этот феномен изменяет „социальную ткань“ и представление о человеческих взаимоотношениях, влияет на особенности градостроительства и развития экономики», — продолжает Кляйненберг. И далее: «Большинство живущих в одиночестве — не бедные, а, напротив, финансово независимые люди».
Быть синглтоном выгодно экономически. Человек располагает большим количеством времени, которое может потратить в том числе на работу, что при должном усердии обеспечит рост доходов.
К тому же когда ты один, то сам несешь ответственность за свои расходы.
Коворкинги, коливинги, новые форматы публичных библиотек, рестораны с общими столами, сидеть за которыми психологически комфортнее, чем за стандартными «на двоих», — жизнь одиночек становится всё более приспособленной под их «специфические» нужды.
Синглтоны — настоящие гейм-чейнджеры на рынке недвижимости. По словам управляющего бюро FlatForma Сергея Хмелёва, Москва продолжает перестраиваться под влиянием нового поколения резидентов. Застройщики разрабатывают и внедряют форматы квартир не только для семей с детьми, но также для пар и одиночек. В некоторых жилых комплексах предлагаются апартаменты площадью от 14 м 2 — для тех, кто приходит домой, чтобы переночевать.
Свойственное одиночкам стремление к комфорту и бережное отношение к личным границам помогают им более эффективно организовывать свою жизнь.
«У меня был идеальный формат отношений: у нее есть свой дом, у меня — свой. Мы жили в одном округе Москвы, дорога занимала 20 минут. Мне очень нравилось бывать у нее, я всегда мог позвать ее к себе или остаться дома один».
Евгений, 42 года, архитектор
Одни, но не одиноки
Мы постоянно окружены людьми. Нас учат думать, что сами мы не способны сделать себя счастливыми, что для этого нам обязательно нужен кто-то еще.
«В состояние одиночества нужно погрузиться, осознать его, прочувствовать. Поначалу оно может вызывать дискомфорт и даже страдание, но, прислушавшись к себе, вы обнаружите, что на самом деле так намного приятнее, чем находиться рядом с неподходящим человеком».
Соня, 35 лет, писательница
Многие из тех, кто когда-либо жили в одиночестве, подтвердят: нет состояния более естественного и гармоничного, если принимать его сознательно, не обращая внимания на общественное мнение или навязчивую социальную политику государства.
«Я единственный ребенок в семье. У меня всегда была своя комната, я привыкла с детства быть одна. Это состояние для меня естественно. Был период, когда я снимала квартиры с другими людьми, — интересный опыт и в целом фан. Но когда у меня снова появилось свое жилье, я вздохнула с облегчением».
Наталья, 37 лет, режиссер
Спокойное отношение к одиночеству позволяет нам адекватнее оценить наши социальные связи и сделать выбор в пользу тех людей, находиться с которыми нам так же комфортно, как с самими собой.
Если же общение происходит по инерции, если нами движут социальные установки или нерациональные страхи — может, стоить дать себе время подумать? В одиночестве.
Паттерны проектирования: Singleton
Что такое синглтон?
Дает гарантию, что у класса будет всего один экземпляр класса.
Предоставляет глобальную точку доступа к экземпляру данного класса.
Приватный конструктор. Ограничивает возможность создания объектов класса за пределами самого класса.
Варианты реализации
Ленивая инициализация: когда класс загружается во время работы приложения именно тогда, когда он нужен.
Простота и прозрачность кода: метрика, конечно, субъективная, но важная.
Потокобезопасность: корректная работа в многопоточной среде.
Высокая производительность в многопоточной среде: потоки блокируют друг друга минимально, либо вообще не блокируют при совместном доступе к ресурсу.
Не ленивая инициализация: когда класс загружается при старте приложения, независимо от того, нужен он или нет (парадокс, в мире IT лучше быть лентяем)
Сложность и плохая читаемость кода. Метрика также субъективная. Будем считать, что если кровь пошла из глаз, реализация так себе.
Отсутствие потокобезопасности. Иными словами, “потокоопасность”. Некорректная работа в многопоточной среде.
Низкая производительность в многопоточной среде: потоки блокируют друг друга все время либо часто, при совместном доступе к ресурсу.
Самая простая реализация. Плюсы:
Простота и прозрачность кода
Высокая производительность в многопоточной среде
Реализация интересна. Мы можем инициализироваться лениво, но утратили потокобезопасность. Не беда: в реализации номер три мы все синхронизируем.
Низкая производительность в многопоточной среде
Отлично! В реализации номер три мы вернули потокобезопасность! Правда, медленную… Теперь метод getInstance синхронизирован, и входить в него можно только по одному. На самом деле нам нужно синхронизировать не весь метод, а лишь ту его часть, в которой мы инициализируем новый объект класса. Но мы не можем просто обернуть в synchronized блок часть, отвечающую за создание нового объекта: это не обеспечит потокобезопасность. Все немного сложнее. Правильный способ синхронизации представлен ниже:
Double Checked Locking
Высокая производительность в многопоточной среде
Не поддерживается на версиях Java ниже 1.5 (в версии 1.5 исправили работу ключевого слова volatile)
Class Holder Singleton
Высокая производительность в многопоточной среде.
Реализация практически идеальная. И ленивая, и потокобезопасная, и быстрая. Но есть нюанс, описанный в минусе. Сравнительная таблица различных реализаций паттерна Singleton:
Реализация | Ленивая инициализация | Потокобезопасность | Скорость работы при многопоточности | Когда использовать? |
---|---|---|---|---|
Simple Solution | — | + | Быстро | Никогда. Либо когда не важна ленивая инициализация. Но лучше никогда. |
Lazy Initialization | + | — | Неприменимо | Всегда, когда не нужна многопоточность |
Synchronized Accessor | + | + | Медленно | Никогда. Либо когда скорость работы при многопоточности не имеет значения. Но лучше никогда |
Double Checked Locking | + | + | Быстро | В редких случаях, когда нужно обрабатывать исключения при создании синглтона. (когда неприменим Class Holder Singleton) |
Class Holder Singleton | + | + | Быстро | Всегда, когда нужна многопоточность и есть гарантия, что объект синглтон класса будет создан без проблем. |
Плюсы и минусы паттерна Singleton
Дает гарантию, что у класса будет всего один экземпляр класса.
Предоставляет глобальную точку доступа к экземпляру данного класса.
Синглтон нарушает SRP (Single Responsibility Principle) — класс синглтона, помимо непосредственных обязанностей, занимается еще и контролированием количества своих экземпляров.
Зависимость обычного класса или метода от синглтона не видна в публичном контракте класса.
Глобальные переменные это плохо. Синглтон превращается в итоге в одну здоровенную глобальную переменную.
Наличие синглтона снижает тестируемость приложения в целом и классов, которые используют синглтон, в частности.
Ну вот и все. Мы рассмотрели с тобой паттерн проектирования синглтон. Теперь в разговоре за жизнь с друзьями программистами ты сможешь сказать не только чем он хорош, но и пару слов о том, чем он плох. Удачи в освоении новых знаний.
Использование Singleton в Unity3D
Вступление
Организация любого, хотя-бы малость серьезного проекта требует хорошей организации кода. Проекты, разрабатываемые в среде Unity3D не являются исключением и, по мере роста проекта, его организация может сыграть не малую роль в качестве исходного продукта.
В данной статье мы постарались не только описать такой подход к организации кода, как Singleton (в народе называемый паттерном проектирования), но и рассмотреть наиболее комфортные и правильные подходы к обработке событий и поговорить об удобности кода в целом.
Итак, в этой статье мы затронем следующие моменты:
Как работает Singleton
Прежде чем начать разбираться в схеме работы паттерна Singleton, необходимо понять что это. Singleton (Синглтон) — некий менеджер, через который производится управление игровыми скриптами. Как правило, синглтоны сохраняются от сцены к сцене без повторной реинициализации (наподобие глобального объекта).
На простейшем примере работу Singleton можно объяснить следующим образом:
В игре присутствуют глобальные объекты (менеджеры), которые будут находиться в игре всегда и могут быть доступны из любого скрипта, что может быть полезно для создания классов управления музыкой, сетевыми функциями, локализацией и всем тем, что используется в единственном экземпляре. Помимо менеджеров в игре будут использоваться и множественные объекты: интерфейсы, игровые персонажи и объекты игрового мира. Все эти объекты будут плотно взаимодействовать с нашими менеджерами для достижения конечной цели.
Рассмотрим для примера организацию работы в мобильной игре:
В нашем случае Singleton — это объект переходящий от сцене к сцене, служащий для управления всеми объектами определенного типа в рамках игровой сцены (игры в целом).
На схеме ниже мы изобразили схему работы на примере мобильной пошаговой онлайн-игры:
Чтобы иметь полную картину, рассмотрим архитектуру этой игры. В данном случае помимо объектов Singleton у нас будут присутствовать следующие элементы:
Реализация Singleton в Unity3D
Для более легкого восприятия мы продолжим рассматривать архитектуру мобильной онлайн игры и посмотрим, как все что мы описали выше, будет выглядеть на практике.
Основа всего метода проектирования — собственно сами классы менеджеры, которые находятся в игре в единственном экземпляре и могут быть вызваны в любой момент. Для создания такого класса менеджера мы можем описать следующий код:
На примере выше мы создали основу для одного из игровых менеджеров (в нашем случае это менеджер Audio). Не обязательно проводить инициализацию через метод Start(). Вы также можете использовать для этого метод Awake(), чтобы ваш объект был готов еще до старта сцены.
Теперь мы допишем наш класс, чтобы он умел загружать и сохранять параметры звука и музыки в игре:
Итак, готово. Теперь наш менеджер аудио умеет загружать и сохранять настройки звуков и музыки. Теперь встает следующий вопрос о том, как мы можем это использовать. На примере ниже, мы продемонстрировали простой пример взаимодействия с менеджером:
На примере выше мы создали компонент, позволяющий нам автоматически включать/отключать AudioSource на объекте на основе статичных полей music и sounds в нашем менеджере.
Допустим, что у вас уже существует несколько менеджеров. Для того, чтобы не выгружать их в каждую сцену как объект отдельно, вы можете создать так называемый Bootstrap-класс, который будет цеплять объекты из заранее созданных префабов. Обязательности в Boostrap-объекте нет, однако мы рекомендуем использовать его просто для вашего удобства.
Рассмотрим наш класс Boostrap-а:
Теперь мы можем использовать Boostrap и добавлять в него новые префабы менеджеров без необходимости их размещения на каждой сцене игры.
Использование моделей данных необязательно, однако вы можете создать их для быстрой обработки данных с сервера и хранения данных в клиенте без необходимости повторных запросов. (к примеру для кеширования данных о пользователях в игре).
В нашем случае после запроса к серверу мы будем выгружать полученные данные в модели и обрабатывать их данные. Рассмотрим простейшую модель данных:
На примере выше у нас изображена модель данных, которая будет служить для обработки базовых статусов, получаемых с сервера в формате JSON. Таким образом, когда мы обращаемся к нашему игровому серверу мы получаем 2 вида ответа:
При успешном обращении мы получаем ответ следующего вида:
А при ошибке мы получаем ответ следующего вида:
Таким образом мы можем парсить ответ сервера при помощи JSON десериализации и нашей модели данных:
Контроллеры будут служить нам для работы множественных объектов в игре (к примеру, противники в игре, либо контроллер игрока). Контроллеры создаются самым обычным способом и цепляются на объекты в игре в качестве компонентов.
Пример простого контроллера игрока:
На примере выше в части кода, где мы обновляем части тела игрока, мы используем модель данных с информацией о профиле игрока, которая была непосредственно подключена в менеджере сети.
Рассмотрим данную строку:
Здесь мы видим, что идет сравнение индекса в цикле с идентификатором волос в модели данных игрока. Данная модель представлена в экземпляре объекта менеджера сети (NetworkManager), где был инициализирован объект для работы с авторизацией (auth), внутри которого размещены модели данных (player_data => profile_data => body).
Взаимодействие с Singleton
Для взаимодействия с менеджерами мы будем использовать либо экземпляр объекта (instance), либо прямое обращение для статических параметров.
Пример работы с instance:
На примере выше мы использовали свойство instance для получения данных о волосах игрока в менеджере NetworkManager.
Пример прямого взаимодействия со static-параметрами:
На примере выше мы обратились напрямую к статичному свойству sounds в менеджере AudioManager.
О плюсах и минусах Singleton
+ Нет необходимости постоянной настройки и описаний полей скриптов в инспекторе
+ К менеджерам можно обращаться через свойство instance
+ Удобный рефакторинг кода
+ Компактность кода
— Сильная зависимость кода
— Доступ только к скриптам-менеджерам в единственном экземпляре
Немного практических примеров
Использование делегатов
Мы можем сделать наш код более отзывчивым, добавив в менеджеры функции-делегаты. Таким образом для каждой функции может быть создан метод обратного вызова (callback).
Рассмотрим данный пример:
На простом примере выше мы создали метод, который вызываем функцию success, если параметр number был меньше 10 и функцию error, когда параметр был больше или равен 10 соответственно.
Использовать данный метод можно следующим способом:
Таким образом мы можем создавать код с управляемым результатом. Теперь мы плавно переходим к примеру использования вместе с Singleton.
Делегаты в связке с Coroutine в Singleton
Для наиболее удобного и правильного взаимодействия с сервером мы можем использовать связку Coroutine-функций и делегатов, тем самым получая возможность отправлять асинхронные запросы и обрабатывать ответ сервера. Ниже мы подготовили пример NetworkManager-а с использованием Coroutine-функций и делегатов.
Рассмотрим данный пример NetworkManager-а:
Теперь мы можем использовать это по назначению:
Таким образом, вы можете выполнять код NetworkManager и управлять его методами при помощи Callback-функций из любой сцены игры.
Заключение
Вообще, тема Singleton-ов и паттернов в целом в рамках проектов на Unity3D заслуживает отдельной книги и рассказать все в одной статье не получится. Ниже мы прикрепили несколько полезных материалов, где вы можете почитать об этом подробнее.