Я предполагаю, что ошибка возникает в этой строке:
con.Open(); // InvalidOperationException if it's already open
, поскольку вы повторно используете соединение, и вы, вероятно, не закрыли его в последний раз.
всегда закрывайте соединение сразу, как только вы закончите с ним, лучше всего используйте using-statement
:
public void run_runcommand(string query)
{
using(var con = new SqlConnection(connectionString))
using(var cmd = new SqlCommand(query, con))
{
con.Open();
// ...
} // close not needed since dispose also closes the connection
}
. Обратите внимание, что вы не должны использовать блок Catch
только для повторного исключения исключения. Если вы ничего не делаете с этим, не поймайте его вообще. Было бы еще лучше использовать throw;
вместо throw ex;
, чтобы сохранить трассировку стека. https://stackoverflow.com/a/4761295/284240
Парафраз из Брайана Баттона:
В отличие от других ответов я не хочу говорить о том, что не так с Singletons, но чтобы показать вам, насколько они сильны и ужасны при правильном использовании!
MyModel myModel = Factory.inject(MyModel.class);
. Вы можете сопоставить MyModel
с TestMyModel
классом, который наследует его, везде, где MyModel
будет введен, вы получите TestMyModel
instread. Как я сказал в названии singleton, речь идет не о одном экземпляре.
Слишком много людей помещают объекты, которые не являются потокобезопасными в одноэлементном шаблоне. Я видел примеры DataContext ( LINQ & nbsp; to SQL-файл ), выполненный в одноэлементном шаблоне, несмотря на то, что DataContext не является потокобезопасным и является чисто единичным объектом.
setInstance
раньше.) Это вряд ли имеет значение, однако, - что weenie, который «нужен», синглтон также не знал ничего необычного в инкапсуляции или что не так с изменчивым глобальным состоянием, поэтому он с благодарностью (?) предоставлял сеттеры для каждого. Один. поле. (И да, это происходит. lot i>. Почти каждый синглтон, который я когда-либо видел в дикой природе, был изменчив по дизайну и часто смущающе.)
– cHao
8 January 2015 в 06:42
goto
и т. Д. Во многих случаях они могут работать i>, но, откровенно говоря, «работает». недостаточно - если вы хотите идти против общепринятой мудрости, вам лучше продемонстрировать, как ваш подход лучше i>, чем обычные решения. И я еще не видел такого случая для шаблона Singleton.
– cHao
11 January 2015 в 00:20
Singleton
. Однако это очень усложняет процесс тестирования. Например, теперь вам нужно иметь возможность разгружать классы по своему усмотрению (на самом деле это не вариант на большинстве языков) или запускать новую виртуальную машину для каждого теста (чтение: тесты могут занимать тысячи раз). Для двоих, однако, зависимость от Singleton
- это деталь реализации, которая теперь протекает по всем вашим тестам.
– cHao
11 January 2015 в 04:07
getInstance
или аналогичного имени и предотвращает существование второго экземпляра. Честно говоря, в этот момент вы могли бы даже не иметь экземпляр one i>.
– cHao
12 January 2015 в 13:30
Недавняя статья по этому вопросу Криса Рита в Кодирование без комментариев .
Примечание. Кодирование без комментариев больше недействительно. Тем не менее, связанная с этим статья была клонирована другим пользователем.
Не то, чтобы сами синглтоны были плохи, но шаблон дизайна GoF. Единственный действительный аргумент, который справедлив, заключается в том, что шаблон проектирования GoF не поддается тестированию, особенно если тесты выполняются параллельно.
Использование одного экземпляра класса является допустимой конструкцией как если вы применяете в коде следующие средства:
Мы использовали Синглтоны в наших решениях с большим успехом, которые можно проверить, обеспечивая детерминированное поведение в параллельных потоках тестового запуска.
Мой ответ о том, как синглтоны вредны, всегда «трудно сделать правильно». Многие из основополагающих компонентов языков - это синглоны (классы, функции, пространства имен и даже операторы), а также компоненты в других аспектах вычислений (localhost, маршрут по умолчанию, виртуальная файловая система и т. Д.), И это не случайно. Хотя они время от времени вызывают проблемы и разочарования, они также могут многое сделать намного лучше.
Два самых больших винта, которые я вижу: рассматривают его как глобальный & amp; неспособный определить замыкание Синглтона.
Все говорят о Синглтоне как о глобалах, потому что они в основном. Тем не менее, много (к сожалению, не все) плохости в глобальном мире не по своей природе не является глобальным, а тем, как вы его используете. То же самое касается Singletons. На самом деле больше, так как «единый экземпляр» действительно не означает «глобально доступный». Это скорее естественный побочный продукт, и, учитывая все плохое, что мы знаем, приходит из него, мы не должны так торопиться, чтобы использовать глобальную доступность. Когда программисты видят Singleton, они, похоже, всегда получают доступ к нему напрямую через свой метод экземпляра. Вместо этого вы должны перейти к нему так же, как и любой другой объект. Большинство кодов не должны даже знать, что он имеет дело с синглтоном (свободная связь, правда?). Если только маленький бит кода обращается к объекту, подобному глобальному, большой вред отменяется. Я рекомендую использовать его, ограничивая доступ к функции экземпляра.
Синтаксический контекст также очень важен. Определяющая характеристика Singleton заключается в том, что существует «только одна», но, по правде говоря, она «только одна» в каком-то контексте / пространстве имен. Они обычно являются одним из: по одному на поток, процесс, IP-адрес или кластер, но также могут быть по одному на процессор, машину, пространство имен языков / загрузчик классов / независимо, подсеть, Интернет и т. Д.
, менее распространенной ошибкой является игнорирование образа жизни Синглтона. Просто потому, что есть только один, это не означает, что Синглтон - это какой-то всемогущий «всегда был и всегда будет», и это вообще не желательно (объекты без начала и конца нарушают всевозможные полезные предположения в коде и должны использоваться только в самых отчаянных обстоятельствах.
Если вы избегаете этих ошибок, Singletons все еще может быть PITA, бит готов увидеть много худших проблем, которые значительно смягчены. Представьте себе сингл Java, то есть явно определяемый как один раз для загрузчика классов (что означает, что ему нужна политика безопасности потоков), с определенными методами создания и уничтожения и жизненным циклом, который диктует, когда и как они вызваны, и чей «экземплярный» метод имеет защиту пакета, поэтому к нему обычно обращаются через другие, неглобальные объекты. Все еще потенциальный источник проблем, но, безусловно, гораздо меньше проблем.
К сожалению, вместо того, чтобы преподавать хорошие примеры того, как делать синглтоны. Мы учим плохим примерам, позволяем программистам убегать используя их на некоторое время, а затем скажите им, что они плохой дизайн.
Синглтон - это шаблон, который можно использовать или злоупотреблять так же, как и любой другой инструмент.
Плохая часть синглтона, как правило, является пользователем (или я должен сказать, что неправильное использование одноэлементного для вещей, не предназначен). Самый большой нарушитель использует синглтон как фальшивую глобальную переменную.
Некоторые кодирующие снобы смотрят на них как на простое прославленное глобальное. Точно так же, как многие люди ненавидят инструкцию goto , есть другие, которые ненавидят идею когда-либо использовать глобальный . Я видел, как несколько разработчиков идут на необычные длины, чтобы избежать global , потому что они считали использование одного в качестве допуска отказа. Странно, но верно.
На практике шаблон Singleton - это всего лишь метод программирования, который является полезной частью вашего инструментария понятий. Время от времени вы можете обнаружить, что это идеальное решение, и поэтому используйте его. Но использование этого только для того, чтобы вы могли похвастаться использованием шаблона дизайна , так же глупо, как и отказаться от использования, потому что это всего лишь глобальный .
См. Википедия Singleton_pattern
. Некоторые считают, что это анти-шаблон, который считает, что он чрезмерно используется, вводя ненужные ограничения в ситуациях, когда единственный экземпляр класса на самом деле не требуется. [1] [2] [3] [4]
blockquote>Ссылки (только соответствующие ссылки из статьи)
- ^ Алекс Миллер. Я ненавижу # 1: Singleton , июль 2007 г.
- ^ Скотт Денсмор. Почему синглетоны злы , май 2004 г.
- ^ Стив Йегге. Синглтоны считаются глупыми , сентябрь 2004 г.
- ^ J.B. Rainsberger, IBM. Используйте свои синглтоны разумно , июль 2001 г.
Синглеты решают одну (и только одну) проблему.
Конфликт ресурсов.
Если у вас есть ресурс, который
(1) может иметь только единственный экземпляр и
(2) вам нужно управлять этим единственным экземпляром,
вам нужен синглтон.
Существует не так много примеров. Файл журнала является большим. Вы не хотите просто отказаться от одного файла журнала. Вы хотите сбросить, синхронизировать и закрыть его должным образом. Это пример одного общего ресурса, который нужно управлять.
Редко, что вам нужен синглтон. Причина, по которой они плохи, заключается в том, что они чувствуют себя как global , и они являются полностью оплаченным членом книги GoF Design Patterns .
Когда вы думаете, что вам нужен глобальный, вы, вероятно, ошиблись в дизайне.
Нехорошо о одиночных играх заключается в том, что вы не можете легко их распространять. В основном вы должны создать какой-то узор decorator или что-то подобное, если вы хотите изменить свое поведение. Кроме того, если в один прекрасный день вы хотите иметь несколько способов сделать это, это может быть довольно болезненно для изменения, в зависимости от того, как вы выставляете свой код.
Одно замечание, если вы используете синглтоны, попробуйте передать их тем, кто в них нуждается, вместо того, чтобы им напрямую обращаться к нему ... В противном случае, если вы когда-нибудь захотите использовать несколько способов сделать то, что делает одиночный, это будет довольно сложно изменить, поскольку каждый класс встраивает зависимостей, если он обращается к одиночному элементу напрямую.
Итак, в основном:
public MyConstructor(Singleton singleton) {
this.singleton = singleton;
}
, а не:
public MyConstructor() {
this.singleton = Singleton.getInstance();
}
Я считаю, что этот тип шаблона называется инъекции зависимостей и обычно считается хорошей.
Как и любой шаблон, хотя ... Подумайте об этом и подумайте, не является ли его использование в данной ситуации неуместным или нет ... Правила обычно нарушаются, и паттерны не должны применяться волей-неволей без мысли.
getInstance()
, то (b) не совсем верно.
– cHao
17 February 2014 в 16:50
getInstance()
, вы эффективно выбрасывали одно полезное различие между шаблоном Singleton и обычной ссылкой. Что касается остальной части кода, то одиночество больше не является свойством. Только вызывающему абоненту getInstance()
когда-либо нужно знать или даже заботиться о том, сколько экземпляров существует. При использовании только одного вызывающего абонента, он требует больше усилий и гибкости для того, чтобы класс надежно обеспечивал единство, чем это делает, чтобы вызывающий абонент просто хранил ссылку и повторно использовал ее.
– cHao
17 February 2014 в 20:52
Misko Hevery, из Google, содержит некоторые интересные статьи именно по этой теме ...
Синглотоны - это патологические лиары , имеет пример единичного тестирования, который иллюстрирует, как синглеты могут это сделать трудно определить цепи зависимостей и запустить или протестировать приложение. Это довольно экстремальный пример злоупотреблений, но тот момент, который он делает, остается в силе:
Синглоты - это не что иное, как глобальное состояние. Глобальное состояние делает так, чтобы ваши объекты могли тайно завладеть вещами, которые не объявлены в их API, и, как результат, Singletons превращает ваши API в патологических лжецов.
blockquote>Где все синглтоны, ушедшие , указывают на то, что инъекция зависимостей облегчила получение экземпляров для требующих их конструкторов, что облегчает основную потребность в плохих глобальных синглтонах, осужденных в первой статье.
Монополия - это дьявол, а синглтоны с не-readonly / изменяемым состоянием являются «реальной» проблемой ...
После прочтения Синглтоны являются патологическими лиарами , как предложено в Ответ jason Я наткнулся на этот маленький лакомый кусочек, который дает наилучший представленный пример того, как часто используются неработающие синглтоны.
Глобально плохо, потому что:
- а. Это вызывает конфликт пространства имен
- b. Он обнародует состояние необоснованным образом
. Когда дело доходит до синглтонов
blockquote>
- a. Явный способ OO их вызова, предотвращает конфликты, поэтому укажите a. не является проблемой
- b. Синглтоны без состояния (например, фабрики) не являются проблемой. Синглтоны с состоянием могут снова попадать в две категории: те, которые неизменяемы или пишут один раз и читают много (файлы конфигурации / свойства). Это неплохо.
В последнем заявлении он ссылается на концепцию блога о том, что «одиночки являются лжецами».
Как это относится к монополии?
Чтобы начать игру монополии, сначала:
- мы сначала устанавливаем правила, чтобы все были на на той же странице
- каждому дано равное начало в начале игры
- представлен только один набор правил, чтобы избежать путаницы
- , правила не разрешено изменять всю игру
Теперь, для тех, кто действительно не играл монополию, эти стандарты в лучшем случае идеальны. Поражение в монополии трудно проглотить, потому что монополия - это деньги, если вы проиграете, вам нужно внимательно следить за тем, как остальные игроки заканчивают игру, а потери обычно бывают быстрыми и раздавливающими. Таким образом, правила в какой-то момент обычно искажаются, чтобы служить интересам некоторых игроков за счет других.
Итак, вы играете монополию с друзьями Бобом, Джо и Эд. Вы быстро наращиваете свою империю и потребляете долю рынка по экспоненциальной ставке. Ваши противники ослабевают, и вы начинаете ощущать запах крови (образно). Ваш приятель Боб поставил все свои деньги в тупик как можно больше низкоценных свойств, но он не получает высокую отдачу от инвестиций так, как он ожидал. Боб, как удар неудачи, приземляется на ваш Boardwalk и вырезается из игры.
Теперь игра идет от дружественных кубиков к серьезному бизнесу. Боб был приведен в пример неудачи, и Джо и Эд не хотят заканчивать так, как «тот парень». Итак, будучи ведущим игроком, вы внезапно становитесь врагом. Джо и Эд начинают практиковать торговлю под столом, прямую инъекцию денег, недооцененную домашнюю замену и вообще что-нибудь, чтобы ослабить вас как игрока, пока один из них не поднялся на вершину.
Затем, вместо того, чтобы выиграть один из них, процесс начинается со всего. Внезапно конечный набор правил становится движущейся мишенью, и игра перерождается в тип социальных взаимодействий, которые составят основу каждого реалити-шоу с высоким рейтингом с момента выживания. Почему, потому что правила меняются, и нет единого мнения о том, как / почему / что они должны представлять, и что еще более важно, никто не принимает решения. Каждый игрок в игре, на тот момент, делает свои собственные правила и хаос наступает, пока два из игроков слишком устали, чтобы поддерживать шараду и медленно сдаваться.
Итак, если правило для игры, точно представленной синглом, монопольное правило будет примером злоупотребления.
Как это относится к программированию?
Помимо всех очевидных проблем безопасности потоков и синхронизации, которые могут быть изменены с помощью синглтонов ... Если у вас есть один набор данных, то есть способный одновременно считываться / управляться несколькими разными источниками и существовать в течение всего времени выполнения приложения, вероятно, самое подходящее время для того, чтобы отступить и спросить: «Я использую здесь правильный тип структуры данных».
Лично я видел, как программист злоупотреблял синглэном, используя его как своего рода переплетенный хранилище баз данных кросс-потоков в приложении. Работая над кодом напрямую, я могу подтвердить, что он был медленным (из-за всех блокировок потоков, необходимых для обеспечения его потокобезопасности) и кошмара для работы (из-за непредсказуемого / прерывистого характера ошибок синхронизации) и почти невозможно проверить в условиях «производства». Конечно, система могла быть разработана с использованием опроса / сигнализации для решения некоторых проблем с производительностью, но это не решило бы проблемы с тестированием и, зачем беспокоиться, когда «настоящая» база данных может уже реализовать ту же функциональность в гораздо более надежной / масштабируемым образом.
. Синглтон - это только вариант, если вам нужно то, что обеспечивает один синглтон. Один экземпляр объекта только для чтения. Это же правило должно также каскадироваться к свойствам объекта / членам.
Singleton.getInstance()
. Язык, который поддерживает отражение, мог бы обойти это, установив поле, где хранится Единый True экземпляр. ИМО, тем не менее, тесты становятся немного менее надежными после того, как вы отправились в обезьяну с частным состоянием другого класса.
– cHao
9 January 2015 в 18:39
Синтаксический шаблон не является проблемой сам по себе. Проблема в том, что шаблон часто используется людьми, разрабатывающими программное обеспечение с объектно-ориентированными инструментами, не имея полного понимания концепций ОО. Когда в этом контексте вводятся синглтоны, они, как правило, превращаются в неуправляемые классы, которые содержат вспомогательные методы для каждого небольшого использования.
Синглтоны также являются проблемой с точки зрения тестирования. Они, как правило, затрудняют запись изолированных модульных тестов. Инверсия управления (IoC) и инъекции зависимостей - это шаблоны, предназначенные для преодоления этой проблемы объектно-ориентированным способом, который поддается модульному тестированию.
В сборке собранных мусора синглэты могут быстро стать проблемой в отношении управления памятью.
Существует также многопоточный сценарий, в котором одиночные игры могут стать узким местом, а также синхронизацией вопрос.
В шаблоне нет ничего неправильного, предполагая, что он используется для какого-либо аспекта вашей модели, который действительно является одиночным.
Я считаю, что обратная реакция вызвана чрезмерным использованием, которое, в свою очередь, из-за того, что это самый простой шаблон для понимания и реализации.
Я хотел бы ответить на 4 пункта в принятом ответе, надеюсь, кто-то может объяснить, почему я ошибаюсь.
Что касается модульных тестов:
У Винса Хьюстона есть эти критерии, которые кажутся мне разумными:
Singleton следует рассматривать только в том случае, если удовлетворяются все три из следующих критериев:
g6] Если принадлежность к одному экземпляру, когда и как происходит инициализация, а глобальный доступ не является проблемой, Singleton недостаточно интересен. blockquote>
- Собственность одного экземпляра не может быть назначена надлежащим образом
- Желательна инициализация в режиме ожидания
- Глобальный доступ для
Сначала класс и его сотрудники должны сначала выполнить свое предназначение, а не сосредоточиться на деоэндентах. Управление жизненным циклом (когда экземпляры удаляются, когда они выходят из сферы действия), не должно быть частью ответственности кладов. Принятая наилучшая практика заключается в создании или настройке нового компонента для управления зависимостями с использованием инъекции зависимостей.
Часто программное обеспечение усложняется, имеет смысл иметь несколько независимых экземпляров класса «singleton» с различным состоянием. В таких случаях ошибочный код для простого захвата синглтона. Использование Singleton.getInstance () может быть в порядке для небольших простых систем, но оно не работает / масштабируется, когда ему может понадобиться другой экземпляр того же класса.
Ни один класс не следует рассматривать как одноэлементный, но скорее, это должно быть применение его использования или того, как он используется для настройки иждивенцев. Для быстрого и противного это не имеет значения - просто luke hardcoding говорит, что пути к файлам не имеют значения, но для больших приложений такие зависимости нужно учесть и управлять более подходящим образом с помощью DI.
Проблемы, причина в тестировании - признак их жесткого кодированного единственного случая использования / среды. Набор тестов и множество тестов являются индивидуальными и отделяют что-то, что несовместимо с hardcoding singleton.
Когда вы пишете код, используя одиночные игры, скажем, регистратор или соединение с базой данных, а затем вы обнаруживаете, что вам нужно больше одного журнала или более одной базы данных, у вас проблемы.
Синглоты делают очень трудно переходить от них к обычным объектам.
Кроме того, слишком легко написать однопоточный однопоточный.
Вместо того, чтобы использовать синглтоны, вы должны передать все необходимые объекты полезности от функции к функции. Это можно упростить, если вы переместите все их в вспомогательный объект, например:
void some_class::some_function(parameters, service_provider& srv)
{
srv.get<error_logger>().log("Hi there!");
this->another_function(some_other_parameters, srv);
}
Синглтоны НЕ плохо. Это плохо, когда вы делаете что-то глобально уникальным, что не является глобально уникальным.
Однако существуют «службы области приложения» (подумайте о системе обмена сообщениями, которая заставляет компоненты взаимодействовать) - это CALLS для одноэлементного, класс «MessageQueue», который имеет метод «SendMessage (...)».
Затем вы можете делать следующее со всех сторон:
MessageQueue.Current.SendMessage (new MailArrivedMessage (...));
И, конечно же, выполните:
MessageQueue.Current.RegisterReceiver (this);
в классах, которые реализовать IMessageReceiver.
Синглтоны также плохи, когда дело доходит до кластеризации. Потому что тогда у вас больше нет «одного синглтона» в вашем приложении.
Рассмотрим следующую ситуацию: как разработчик вам необходимо создать веб-приложение, которое обращается к базе данных. Чтобы гарантировать, что одновременные вызовы базы данных не конфликтуют друг с другом, вы создаете thread-save SingletonDao
:
public class SingletonDao {
// songleton's static variable and getInstance() method etc. omitted
public void writeXYZ(...){
synchronized(...){
// some database writing operations...
}
}
}
. Таким образом, вы уверены, что в вашем приложении существует только один синглтон, и вся база данных проходит через это один и только SingletonDao
. Теперь ваша рабочая среда выглядит следующим образом: [/g0]
До сих пор все в порядке.
Теперь подумайте, что вы хотите настроить несколько экземпляров своего веб-приложения в кластер. Теперь у вас есть что-то вроде этого:
[/g1]
Это звучит странно, но теперь у вас много синглтонов в вашем приложении. И это именно то, что не должно быть одноэлементным: иметь множество объектов. Это особенно плохо, если вы, как показано в этом примере, хотите сделать синхронизированные вызовы в базу данных.
Конечно, это пример плохого использования одноэлементного кода. Но сообщение этого примера: вы не можете полагаться на то, что в вашем приложении есть только один экземпляр singleton, особенно когда дело касается кластеризации.
Образец появляется, когда несколько человек (или команды) приходят к аналогичным или идентичным решениям. Многие люди по-прежнему используют синглеты в своей первоначальной форме или используют фабричные шаблоны (хорошее обсуждение в Modern C ++ Design от Alexandrescu). Параллелизм и трудности в управлении временем жизни объекта являются основными препятствиями, при этом первый легко управляется, как вы предлагаете.
Как и все варианты, Singleton имеет свою долю взлетов и падений. Я думаю, что их можно использовать в умеренных количествах, особенно для объектов, которые выживают в течение срока службы приложения. Тот факт, что они напоминают (и, вероятно, есть) глобалы, предположительно выбрасывает пуристов.
Вот еще одна вещь о одиночных играх, о которых никто еще не сказал.
В большинстве случаев «singletonity» является деталью реализации для некоторого класса, а не характеристикой его интерфейса. Inversion of Control Container может скрыть этот признак от пользователей класса; вам просто нужно отметить свой класс как одноэлементный (с аннотацией @Singleton
в Java, например) и все; IoCC сделает все остальное. Вам не нужно предоставлять глобальный доступ к вашему экземпляру singleton, потому что доступ уже управляется IoCC. Таким образом, нет ничего плохого в IoC Singletons.
GoF Singletons в противоположность IoC Синглтоны должны выставлять «singletonity» в интерфейсе методом getInstance (), и поэтому они страдают от всего сказанного выше.
Поскольку они являются объектно-ориентированными глобальными переменными, вы можете обычно создавать свои классы таким образом, чтобы они вам не нужны.
Проблемы с одиночными точками - проблема увеличенного объема и, следовательно, связи . Нельзя отрицать, что есть некоторые ситуации, когда вам нужен доступ к одному экземпляру, и это можно сделать другими способами.
Теперь я предпочитаю создавать вокруг инверсию управления (IoC) и позволяют контролировать время жизни контейнера. Это дает вам преимущество классов, которые зависят от экземпляра, чтобы не знать о том, что существует один экземпляр. Время жизни синглтона можно изменить в будущем. Когда-то такой пример, с которым я столкнулся в последнее время, был простой настройкой от однопоточного к многопоточному.
FWIW, если это PIA, когда вы пытаетесь выполнить его тестирование, тогда он отправится в PIA, когда вы попытаетесь отладить ошибку исправить или улучшить его.
setInstance
раньше.) Это вряд ли имеет значение, однако, - что weenie, который «нужен», синглтон также не знал ничего необычного в инкапсуляции или что не так с изменчивым глобальным состоянием, поэтому он с благодарностью (?) предоставлял сеттеры для каждого. Один. поле. (И да, это происходит. lot i>. Почти каждый синглтон, который я когда-либо видел в дикой природе, был изменчив по дизайну и часто смущающе.)
– cHao
8 January 2015 в 06:42
goto
и т. Д. Во многих случаях они могут работать i>, но, откровенно говоря, «работает». недостаточно - если вы хотите идти против общепринятой мудрости, вам лучше продемонстрировать, как ваш подход лучше i>, чем обычные решения. И я еще не видел такого случая для шаблона Singleton.
– cHao
11 January 2015 в 00:20
Singleton
. Однако это очень усложняет процесс тестирования. Например, теперь вам нужно иметь возможность разгружать классы по своему усмотрению (на самом деле это не вариант на большинстве языков) или запускать новую виртуальную машину для каждого теста (чтение: тесты могут занимать тысячи раз). Для двоих, однако, зависимость от Singleton
- это деталь реализации, которая теперь протекает по всем вашим тестам.
– cHao
11 January 2015 в 04:07
getInstance
или аналогичного имени и предотвращает существование второго экземпляра. Честно говоря, в этот момент вы могли бы даже не иметь экземпляр one i>.
– cHao
12 January 2015 в 13:30