36 Вопрос: Разница между статическим классом и одноэлементным шаблоном?

вопрос создан в Sun, Nov 15, 2015 12:00 AM

Какая реальная (то есть практическая) разница существует между статическим классом и одноэлементным шаблоном?

Оба могут быть вызваны без создания экземпляров, оба предоставляют только один «Экземпляр», и ни один из них не является поточно-ориентированным. Есть ли другая разница?

    
1648
  1. В зависимости от языковой реализации и ваших шаблонов использования, Singleton может быть менее эффективным из-за накладных расходов на вызов метода getInstance() каждый раз, когда вы хотите использовать его (хотя, вероятно, в большинстве случаев это не имеет значения ) .
    2009-02-06 08: 45: 15Z
  2. Ответов уже много. На самом деле это объект singleton, где методы static - это просто функции, не являющиеся объектами OO.
    2011-01-16 03: 04: 48Z
  3. Зависит от реализации. csharpindepth .com /Статьи /Общие /Singleton.aspx
    2011-07-14 09: 48: 41Z
  4. Существует различие, когда вы хотите разрешить третьим сторонам предоставлять реализацию класса. В этом случае вам обычно нужны также фабричные шаблоны. См. agiletribe.wordpress.com/2013/10/08/. ...
    2013-10-20 18: 48: 12Z
  5. ИМО, этот ответ очень хорошо подводит итог stackoverflow.com/questions/14097656/…
    2014-10-27 13: 18: 34Z
30 ответов                              30                         

Что заставляет вас говорить, что одноэлементный или статический метод не является поточно-ориентированным? Обычно оба должны быть реализованы, чтобы быть потокобезопасными.

Большая разница между синглтоном и кучей статических методов заключается в том, что синглтоны могут реализовывать интерфейсы (или наследовать полезные базовые классы, хотя, по моему опыту, это менее распространено), поэтому вы можете передавать синглтон, как если бы он был "просто другая" реализация.

    
1154
2017-05-24 11: 09: 16Z
  1. Что ж, если вы предпочитаете это, ни один из них не является по своей сути потокобезопасным, вы должны сделать их безопасными для обоих потоков, так что никакой разницы нет.
    2009-02-06 08: 20: 32Z
  2. Можете ли вы привести пример чего-то, что является по своей сути потокобезопасным, кроме неизменяемых типов?
    2009-02-06 08: 23: 01Z
  3. To Skeet: Люди, говорящие, что синглтон не является потокобезопасным, означают, что синглтон совместно используется потоками излишне все время, в то время как объекты стека получают делиться, когда вам это нужно, это означает, что вам не нужно выполнять ненужную синхронизацию.
    2009-02-06 10: 20: 16Z
  4. @ Geek: представьте, что синглтон реализует интерфейс Foo, и у вас есть метод, принимающий Foo в качестве параметра. При такой настройке вызывающие абоненты могут выбрать использование синглтона в качествена - или они могли бы использовать другую реализацию. Метод отделяется от синглтона. Сравните это с ситуацией, когда у класса просто есть статические методы - каждый фрагмент кода, который хочет вызвать эти методы, тесно связан с классом, потому что ему нужно указать, какой класс содержит статические методы.
    2013-09-07 08: 01: 41Z
  5. @ AmirBareket: хотя это не одноэлементный шаблон в соответствии с одноэлементным шаблоном проектирования - если сам класс позволяет создавать несколько экземпляров, это не одноэлементный IMO, независимо от того, что завод делает.
    2014-04-10 15: 42: 20Z

Правильный ответ - Джон Скит, на другом форуме здесь .

  

Синглтон позволяет получить доступ к одному   созданный экземпляр - этот экземпляр (или   скорее ссылка на этот экземпляр)   может быть передан в качестве параметра другому   методы, и рассматриваются как нормальные   объект. р>      

Статический класс допускает только статический   Методы. р>

    
439
2011-01-19 15: 28: 31Z
  1. Однако зачем передавать параметр Singleton в качестве параметра, если вы можете получить доступ к одному и тому же экземпляру практически из любого места, вызвав статический метод getInstance ()?
    2012-07-01 09: 58: 32Z
  2. @ HenriqueOrdine Таким образом, он может вписаться в существующий код и предоставить интерфейс?
    2012-07-12 10: 54: 58Z
  3. @ HenriqueOrdine Они говорят о статическом классе, а не о классе со статическими методами. Статический класс не может быть создан. Тем не менее, если вы передаете экземпляр (нестатического) класса, который содержит статические методы, вы не можете вызывать статические методы для экземпляра.
    2012-08-25 00: 09: 42Z
  4. Что такое статический класс? По крайней мере, в Java такого нет.
    2012-08-25 09: 00: 45Z
  5. @ Горан Меня изначально очень смутила ваша формулировка. Вы сказали: «Вы не можете вызывать статические методы в экземпляре». Я читал это как «если у вас есть ссылка на экземпляр объекта, вы не можете вызвать какие-либо статические методы, которые он может иметь». Это, конечно, неправильно. Прочитав его несколько раз, я думаю, что вы имели в виду «внутри статических методов вы не можете получить доступ к нестатическим объектам в классе», что является правильным. Хочу уточнить, что для тех, кто плохо знаком с этими понятиями, кто сталкивается с этим ответом и читает ваши комментарии.
    2013-04-30 17: 59: 11Z
  1. Объекты Singleton хранятся в куче , но статические объекты хранятся в стеке .
  2. Мы можем клонировать (если дизайнер не запретил это) объект-одиночка, но мы не можем клонировать объект статического класса .
  3. Синглтон-классы следуют ООП (объектно-ориентированные принципы), статические классы - нет.
  4. Мы можем реализовать interface с классом Singleton, но статические методы класса (или, например, C # static class) не могут.
342
2017-03-15 15: 31: 59Z
  1. Второе утверждение неверно. Мы не можем клонировать объект Singleton. Реализация Singleton должна отказаться от этого. Если вы действительно можете клонировать Синглтон, это не Синглтон.
    2013-09-27 07: 01: 24Z
  2. Это неверный ответ для Java: ни синглтон, ни статика не используют стек.
    2013-10-20 18: 52: 02Z
  3. # 1 не важен. № 2 описывает дефектную реализацию. № 3 совершенно неоправдан.
    2014-03-05 14: 49: 17Z
  4. Как статический объект может храниться в стеке? Новый кадр стека создается при вызове метода, в нем хранятся локальные переменные метода, этот кадр стека удаляется при возврате метода, и эти локальные переменные теряются. Конечно, стек быстрый, но он не подходит для хранения статических объектов.
    2014-06-08 10: 36: 56Z
  5. Я не могу понять, сколько голосов проголосовало за это. 1) Почему Singleton должен храниться в стеке? В управляемых языках, таких как C # или Java, данные хранятся в управляемой куче, за исключением локальных переменных /параметров метода. 2) Если вы можете клонировать его, то это не правильно реализованный синглтон. 3) Синглтон известен как анти-паттерн ООП; то есть то, чего вам следует избегать, если это возможно. 4) Это единственное, что правильно.
    2016-04-28 07: 05: 46Z

Шаблон Singleton имеет несколько преимуществ по сравнению со статическими классами. Во-первых, синглтон может расширять классы и реализовывать интерфейсы, в то время как статический класс не может (он может расширять классы, но он не наследует членов их экземпляров). Синглтон может быть инициализирован лениво или асинхронно, в то время как статический класс обычно инициализируется при первой загрузке, что приводит к потенциальным проблемам с загрузчиком классов. Однако самое важное преимущество заключается в том, что синглетами можно обрабатывать полиморфно, не заставляя пользователей предполагать, что существует только один экземпляр.

    
137
2009-02-06 08: 30: 56Z
  1. + 1 для хороших, прагматичных моментов. Шаблон синглтона в общем случае чрезмерно используется, но есть несколько ситуаций, когда он подходит. Смотрите также: agiletribe.wordpress.com/2013/10/08 /...
    2013-10-20 18: 54: 42Z
  2. + 1 для указания на нетерпеливую инициализацию статических классов.
    2014-08-04 06: 20: 07Z
  3. Вы правы в том, что вы полиморфны. Это самый важный момент
    2015-08-02 21: 40: 47Z
  4. Вложенный статический класс может реализовывать интерфейс. Попробуй кодировать, будет работать. Я мог бы скомпилировать код без каких-либо ошибок.
    2016-05-09 10: 25: 13Z

static классы не для чего-либо, что нуждается в состоянии. Это полезно для объединения нескольких функций, например Math (или Utils в проектах). Таким образом, имя класса просто дает нам подсказку, где мы можем найти функции и ничего более.

Singleton - мой любимый шаблон, и я использую его для управления чем-то в одной точке. Он более гибкий, чем классы static, и может поддерживать его состояние. Он может реализовывать интерфейсы, наследовать от других классов и разрешать наследование.

Мое правило выбора между static и singleton:

Если есть несколько функций, которые должны храниться вместе, то выбор static. Все, что требует единого доступа к некоторым ресурсам, может быть реализовано как singleton.

    
63
2019-03-26 05: 49: 26Z
  1. Почему статические классы не должны делать ничего, что должно сохранять состояние?
    2012-10-09 21: 24: 28Z
  2. @ Trisped: вы не можете точно контролировать инициализацию и финализацию.
    2013-01-03 23: 55: 03Z
  3. Джон Скит ответил хорошо. Это не очень хорошая разница.
    2015-06-30 11: 30: 40Z
  4. вы потеряли меня в "Singleton - мой любимый шаблон". Синглтон - такой острый угол, что его следует рассматривать как анти-паттерн, так и паттерн. Классы могут иметь статические состояния, это также единый доступ, если любое статическое состояние является более «единичным доступом», чем одиночные, потому что большинство реализаций синглтона нарушены, т.е. вы можете клонировать синглтон, в то время как статическое определение определено как уникальное.
    2017-02-25 06: 21: 06Z
  5. @ KyleDelaney: просто State - это комбинация различных свойств объекта, которые обычно меняются со временем. Вы можете Google для формального определения.
    2017-05-18 23: 59: 19Z

Статический класс: -

  1. Вы не можете создать экземпляр статического класса.

  2. Загружается автоматически общеязыковой средой (CLR) .NET Framework при загрузке программы или пространства имен, содержащих класс.

  3. Статический класс не может иметь конструктор.

  4. Мы не можем передать статический класс методу.

  5. Мы не можем наследовать статический класс от другого статического класса в C #.

  6. Класс, имеющий все статические методы.

  7. Лучшая производительность (статические методы связаны во время компиляции)

Singleton: -

  1. Вы можете создать один экземпляр объекта и использовать его повторно.

  2. Экземпляр Singleton создается впервые по запросу пользователя.

  3. Класс Singleton может иметь конструктор.

  4. Вы можете создать объект одноэлементного класса и передать его методу.

  5. Класс Singleton не говорит о каких-либо ограничениях наследования.

  6. Мы можем располагать объекты одноэлементного класса, но не статического класса.

  7. Методы могут быть переопределены.

  8. Может быть отложено при необходимости (статические классы всегда загружаются).

  9. Мы можем реализовать интерфейс (статический класс не может реализовать интерфейс).

55
2015-06-01 11: 49: 33Z
  1. Статические классы имеют конструкторы: msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
    2016-06-09 17: 21: 32Z
  2. Да, у static может быть конструктор, который является внутренним для этого класса. Это вызывается, когда вызывается любой статический метод в классе.
    2017-01-06 15: 24: 27Z
  3. Для синглтона во время компиляции он сохраняется в памяти HEAP, но если его экземпляр создается один раз, он сохраняется в STACK?
    2017-10-29 00: 33: 21Z
  4. @ Luminous_Dev Нет. Любой одноэлементный экземпляр является экземпляром объекта в конце дня. Он будет храниться в куче без сомнения.
    2018-01-23 02: 32: 40Z
  5. @ rahulmr Важное отличие: конструктор также получает invперед первым (только AKA) экземпляром.
    2018-12-18 11: 37: 43Z

Статический класс - это класс, в котором есть только статические методы, для которых более подходящим словом будут "функции". Стиль дизайна, воплощенный в статическом классе, является чисто процедурным.

Синглтон, с другой стороны, является шаблоном, характерным для ОО-дизайна. Это экземпляр объекта (со всеми присущими ему возможностями, такими как полиморфизм), с процедурой создания, которая гарантирует, что существует только один экземпляр этой конкретной роли в течение всей его жизни.

    
49
2009-02-06 08: 35: 14Z
  1. полиморфизм вообще не вступает в игру с одиночками
    2009-02-06 09: 59: 41Z
  2. Итак, вы думаете. Я думаю по другому. ;) Например, представьте себе одиночную фабрику, которая возвращает интерфейс. Вы знаете, что получаете ISingleton (и он всегда один и тот же), но не обязательно, какая реализация.
    2009-02-06 22: 39: 06Z
  3. Вложенный статический класс также может иметь методы экземпляра, его нельзя ограничивать только статическими методами. Кодируйте его, и вы можете видеть.
    2016-05-09 10: 35: 39Z
  4. В языках с более красивой объектной моделью (например, Ruby) классы также являются объектами. «Чисто процедурный» аспект статического класса - это произвольное ограничение, налагаемое языком.
    2017-10-27 14: 03: 17Z

В шаблоне синглтона вы можете создать синглтон как экземпляр производного типа, вы не можете сделать это со статическим классом.

Быстрый пример:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer
    
33
2009-02-06 08: 16: 41Z
  1. Это на самом деле не одноэлементный шаблон, для меня это больше похоже на фабрику.
    2009-02-06 09: 51: 57Z
  2. Не совсем, принципиальное различие между ними состоит в том, что Singleton будет «кэшировать» свой единственный объект и продолжать возвращать (ссылку на) один и тот же объект. Шаблон Factory создаст новые экземпляры.
    2009-02-06 10: 00: 35Z
  3. Тогда это proxy-singleton:)
    2009-02-06 10: 02: 34Z
  4. Хм, я знаю эту разновидность Singleton как MonoState.
    2009-08-16 16: 00: 43Z
  5. примером является фабричный шаблон
    2014-08-13 06: 38: 56Z

Подробнее о ответе Джона Скита

  

Большая разница между синглтоном и кучей статических методов заключается в том, что синглтоны могут реализовывать интерфейсы (или наследовать полезные базовые классы, хотя это не так часто встречается в IME), поэтому вы можете обойти синглтон, как если бы он был «просто другим». "реализация.

С одиночками проще работать при модульном тестировании класса. Где бы вы ни передавали синглтоны в качестве параметра (конструкторы, сеттеры или методы), вы можете вместо этого заменить смоделированную или заглушенную версию сингла.leton.

    
24
2017-05-23 12: 34: 57Z
  1. Я не думаю, что вы можете напрямую издеваться над синглтоном. Разве вам не нужно объявлять интерфейс, который реализуют и singleton, и класс mock?
    2014-02-12 16: 39: 58Z
  2. @ espertus Почему вы не можете издеваться над своим синглтоном? Пример использования mockito MySingleton mockOfMySingleton = mock(MySingleton.class).
    2014-02-13 17: 59: 10Z
  3. вы правы, вы можете смоделировать это с помощью таких инструментов, как mockito, которые используют отражение. Я имел в виду, что вы не можете издеваться над ним напрямую, подклассифицируя его и переопределяя его методы.
    2014-02-13 18: 34: 32Z
  4. @ espertus Почему бы и нет? Когда вы создаете экземпляр тестируемого объекта, вы можете заменить реализацию подкласса вашего синглтона, где бы вы ни использовали оригинал. Пример: new ClazzToTest(mockSingleton);
    2014-02-13 18: 49: 15Z
  5. Я не использовал Mockito, но как вы можете создать подкласс для класса с закрытым конструктором, как в случае синглетонов, кроме как с помощью отражения? Связанные обсуждения: stackoverflow.com/questions/2302179/mocking-a-singleton -class stackoverflow.com/questions/15939023/…
    2014-02-13 21: 13: 39Z

Еще одно преимущество одиночного файла заключается в том, что его можно легко сериализовать, что может потребоваться, если вам нужно сохранить его состояние на диске или отправить его куда-нибудь удаленно.

    
21
2011-08-08 03: 36: 34Z

Вот хорошая статья: http: //javarevisited .blogspot.com.au /2013/03 /разница между ними-одиночки-шаблон-против-статического класса java.html

Статические классы

  • класс, имеющий все статические методы .
  • лучшая производительность (статические методы связаны во время компиляции)
  • не может переопределить методы, но может использовать скрытие методов. ( Что такое метод сокрытия в Java? Даже объяснение JavaDoc сбивает с толку )

    public class Animal {
        public static void foo() {
            System.out.println("Animal");
        }
    }
    
    public class Cat extends Animal {
        public static void foo() {  // hides Animal.foo()
            System.out.println("Cat");
        }
    }
    

Singleton

Подводя итог, я бы использовал статические классы только для хранения утилит и использования Singleton для всего остального.

редактирует

20
2017-09-12 04: 49: 23Z
  1. Я не знаю о Java, но в .Net,Ваши последние два пункта неверны. Статические классы могут ссылаться на статические свойства и поля, поэтому по состоянию они равны. И они загружаются лениво - статический конструктор запускается, когда: 1) Создается экземпляр класса. 2) Ссылка на любой из статических членов класса. 1 не применяется, что оставляет 2. Таким образом, статический класс не загружается, пока он не используется в первый раз.
    2015-01-26 16: 44: 45Z
  2. Для статического класса, хотя вы не можете переопределить статический метод, вы можете скрыть статический метод от его родителя.
    2017-09-04 15: 57: 18Z
  3. если Animal animal = new Cat();, то animal.foo(); что происходит?
    2017-10-29 00: 34: 38Z
  4. @ jmoreno статический класс не загружается до первого использования? Я считаю, что он хранится в памяти стека во время компиляции. И к нему мгновенно получают доступ .. не так ли?
    2017-10-29 00: 41: 27Z
  5. @ Luminous_Dev: по крайней мере для .net, статический класс имеет конструктор, который запускается при первом обращении, поэтому он не доступен мгновенно. Статический конструктор может теоретически занимать неограниченное количество времени. Где он (или любой другой класс хранится) - это деталь реализации, которая на самом деле не имеет отношения к этому вопросу.
    2017-10-29 01: 00: 34Z

Я не большой теоретик ОО, но, насколько я знаю, я думаю, что единственная особенность ОО, которой нет в статических классах по сравнению с синглетонами, - это полиморфизм. Но если вам это не нужно, со статическим классом вы, конечно, можете иметь наследование (не уверенное в реализации интерфейса) и инкапсуляцию данных и функций.

Комментарий Морендила: «Стиль дизайна, воплощенный в статическом классе, является чисто процедурным». Я могу ошибаться, но я не согласен. В статических методах вы можете получить доступ к статическим элементам, которые будут точно такими же, как одноэлементные методы для доступа к их отдельным элементам экземпляра.

Редактирование:
Сейчас я на самом деле думаю, что еще одно отличие состоит в том, что статический класс создается при запуске программы * и живет в течение всего жизненного цикла программы, тогда как в какой-то момент экземпляр Singleton создается явно и может быть уничтожен также.

* или он может быть создан при первом использовании, я думаю, в зависимости от языка.

    
17
2012-02-09 14: 23: 20Z
  1. Да, все остальные, кажется, игнорируют тот факт, что класс со статическими методами может также иметь закрытые статические поля, которые он все еще может использовать для поддержания состояния (и выставлять некоторые из них к клиентскому коду через общедоступные статические установщики /получатели).
    2012-02-09 14: 14: 44Z

Чтобы проиллюстрировать точку зрения Джона, то, что показано ниже, невозможно, если Logger был статическим классом. Класс SomeClass ожидает, что экземпляр реализации ILogger будет передан в его конструктор.

Синглтон-класс важен для внедрения зависимости.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var someClass = new SomeClass(Logger.GetLogger());
        }


    }

    public class SomeClass 
    {
        public SomeClass(ILogger MyLogger)
        {

        }
    }

    public class Logger : ILogger
    {
        private static Logger _logger;
        private Logger() { }

        public static Logger GetLogger()
        {
            if (_logger==null)
            {
                _logger = new Logger();
            }

            return _logger;
        }

        public void Log()
        {

        }

    }


    public interface ILogger
    {
         void Log();
    }
}
    
15
2013-06-09 23: 49: 01Z

Ну, синглтон - это просто нормальный класс, который создается, но только один раз и косвенно из клиентского кода. Статический класс не создан. Насколько я знаю, статические методы (статический класс должен иметь статические методы) работают быстрее, чем нестатические.

Edit:
Описание правила производительности FxCop: «Методы, которые не обращаются к данным экземпляра или вызывают методы экземпляра, могут быть помечены как статические (Shared в VB). После этогокомпилятор будет выдавать не виртуальные сайты вызовов этим участникам, что предотвратит проверку во время выполнения для каждого вызова, которая гарантирует, что текущий указатель объекта не равен нулю. Это может привести к ощутимому приросту производительности для чувствительного к производительности кода. В некоторых случаях невозможность доступа к текущему экземпляру объекта представляет проблему правильности. "
На самом деле я не знаю, относится ли это также к статическим методам в статических классах.

    
11
2009-02-10 11: 25: 37Z

Одиночные экземпляры создаются, только один экземпляр когда-либо создавался, следовательно, single в Singleton.

Статический класс не может быть создан чем-либо, кроме себя самого.

    
9
2009-02-06 08: 15: 59Z
  1. Статический класс может быть очень сильно создан в java. Прочитайте docs.oracle.com/javase/tutorial/java/javaOO/nested.html. Также ознакомьтесь с моим ответом stackoverflow.com/a/37114702/1406510
    2016-05-09 11: 33: 11Z

Синглтон - лучший подход с точки зрения тестирования. В отличие от статических классов, синглтон может реализовывать интерфейсы, и вы можете использовать макетный экземпляр и внедрять их.

В приведенном ниже примере я проиллюстрирую это. Предположим, у вас есть метод isGoodPrice (), который использует метод getPrice (), и вы реализуете getPrice () как метод в одиночном коде.

синглтон, обеспечивающий функциональность getPrice:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

Использование getPrice:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

Окончательная реализация Singleton:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

тестовый класс:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

В случае, если мы воспользуемся альтернативой использования статического метода для реализации getPrice (), было сложно смоделировать getPrice (). Вы можете издеваться над статическим электричеством, но не все продукты могут его использовать.

    
6
2014-04-13 13: 02: 12Z
  1. Теперь это не безопасно для потоков и, как правило, неприятно с точки зрения доступа к реализации интерфейса. Конечно, наличие интерфейса хорошо для тестируемости - но зачем тогда синглтон? Просто избегайте синглтона вообще; имейте один класс, реализующий его для производственных целей, одну реализацию для целей тестирования, и вставляйте правильный экземпляр в зависимости от того, что вы делаете. Нет необходимости связывать синглтон с вызывающими.
    2014-04-13 13: 22: 42Z
  2. спасибо за отзыв. это очень просто сделать потокобезопасным. кроме того, я использую синглтон для кэширования.
    2014-04-13 20: 50: 49Z
  3. Да, хотя и с бессмысленными накладными расходами. Опять же, проще не использовать синглтон.
    2014-04-13 20: 51: 45Z

Я согласен с этим определением:

  

Слово " single " означает один объект на протяжении всей жизни приложения.   цикл, поэтому сфера находится на уровне приложения.

     

У статического нет   любой указатель объекта, поэтому область действия находится на уровне домена приложения.

     

Более того, оба должны быть реализованы для обеспечения многопоточности.

Вы можете найти и другие интересные отличия по поводу синглтон-паттерна и статического класса     

6
2016-02-11 15: 13: 56Z

Основные отличия:

  • Singleton имеет экземпляр /объект, в то время как статический класс представляет собой набор статические методы
  • Синглтон может быть расширен, например, через интерфейс в то время как статический класс не может быть.
  • Синглтон может быть унаследован, что поддерживает принципы открытия /закрытия в Принципы SOLID с другой стороны, статический класс не может быть унаследован и нам нужно внести изменения в себя.
  • Объект Singleton может быть передан методам в то время как статический класс не имеет экземпляра, который не может быть передан в качестве параметров
6
2018-04-28 16: 12: 57Z

Одним заметным отличием является различная реализация, которая идет с Singletons.

Со статическими классами он создается CLR, и мы не можем его контролировать. с одиночными объектами объект создается в первом экземпляре, к которому пытаются получить доступ.

    
5
2012-06-27 14: 03: 25Z

Во многих случаях эти два не имеют практического различия, особенно если экземпляр синглтона никогда не изменяется или изменяется очень медленно, например, проведение конфигураций.

Я бы сказал, что самое большое отличие состоит в том, что синглтон по-прежнему является обычным Java Bean-компонентом, а не специализированным классом Java, предназначенным только для статических функций. И из-за этого синглтон принимается во многих других ситуациях; на самом деле это стратегия реализации Spring Framework по умолчанию. Потребитель может знать, а может и не знать, что это передаваемый синглтон, он просто обрабатывает его как обычный Java-бин. Если требования изменяются, а синглтон должен вместо этого стать прототипом, как мы часто видим в Spring, это можно сделать полностью без каких-либо изменений кода для потребителя.

Кто-то еще упоминал ранее, что статический класс должен быть чисто процедурным, например, java.lang.Math. На мой взгляд, такой класс никогда не должен передаваться, и они никогда не должны содержать ничего, кроме static final, в качестве атрибутов. Для всего остального используйте синглтон, так как он гораздо более гибкий и простой в обслуживании.

    
4
2012-06-07 01: 07: 22Z

У нас есть база БД, которая устанавливает соединения с Back-end. Чтобы избежать грязного чтения среди нескольких пользователей, мы использовали одноэлементный шаблон, чтобы обеспечить доступность одного экземпляра в любой момент времени.

В c # статический класс не может реализовать интерфейс. Когда одному классу экземпляра необходимо реализовать интерфейс для бизнес-контрактов или целей IoC, здесь я использую шаблон Singleton без статического класса

Singleton предоставляет способ для поддержания состояния в сценариях без сохранения состояния

Надеюсь, что это поможет вам.

    
4
2012-06-27 10: 11: 34Z
  1. Ленивая загрузка
  2. Поддержка интерфейсов для обеспечения отдельной реализации
  3. Возможность вернуть производный тип (как комбинация отложенной загрузки и реализации интерфейса)
3
2012-05-08 16: 34: 31Z
  1. Вложенный статический класс может очень сильно реализовать интерфейс в Java. Ваш второй пункт неверен.
    2016-05-09 10: 43: 54Z

а. Сериализация - Статические члены принадлежат классу и, следовательно, не могут быть сериализованы.

б. Хотя мысделали конструктор закрытым, статические переменные-члены все равно будут перенесены в подкласс.

с. Мы не можем выполнить отложенную инициализацию, так как все будет загружено только при загрузке класса.

    
3
2014-01-14 17: 46: 10Z

С точки зрения клиента, статическое поведение известно клиенту, но поведение Singleton может быть скрыто от клиента. Клиент, возможно, никогда не узнает, что есть только один экземпляр, с которым он играет снова и снова.

    
3
2014-08-04 06: 23: 08Z

Я прочитал следующее и думаю, что это тоже имеет смысл:

  

Забота о бизнесе

     

Помните, одно из самых важных правил OO - это то, что объект отвечает за себя. Это означает, что вопросы, касающиеся жизненного цикла класса, должны обрабатываться в классе, а не делегироваться таким языковым конструкциям, как static и т. Д.

из книги «Объектно-ориентированный мыслительный процесс», 4-е издание.

    
3
2015-12-30 21: 05: 30Z

В статье, которую я написал, я описал свою точку зрения о том, почему синглтон намного лучше, чем статический класс:

  1. Статический класс на самом деле не является каноническим классом - это пространство имен с функциями и переменными
  2. Использование статического класса не является хорошей практикой из-за нарушения принципов объектно-ориентированного программирования
  3. Статический класс не может быть передан в качестве параметра для другого
  4. Статический класс не подходит для «ленивой» инициализации
  5. Инициализация и использование статического класса всегда отслеживаются
  6. Реализация управления потоками - сложная задача
3
2016-07-07 15: 53: 06Z
  1. Я хотел бы почистить это для грамматики английского языка, но в остальном это интересное чтение:)
    2014-07-30 04: 53: 06Z
  1. Мы можем создать объект одноэлементного класса и передать его методу.

  2. Класс Singleton не ограничивает наследование.

  3. Мы не можем утилизировать объекты статического класса, но можем создать одноэлементный класс.

3
2016-10-18 18: 58: 58Z

Существует огромная разница между экземпляром одного статического класса (то есть одним экземпляром класса, который является статической или глобальной переменной) и одним статическим указателем к экземпляру класса в куче:

При выходе из приложения будет вызван деструктор экземпляра статического класса. Это означает, что если вы использовали этот статический экземпляр как синглтон, ваш синглтон перестал работать правильно. Если все еще выполняется код, который использует этот синглтон, например, в другом потоке, этот код, скорее всего, потерпит крах.

    
2
2016-05-19 19: 27: 17Z
  1. Таким образом, если приложение завершит работу, останется ли Singleton в памяти?
    2016-05-09 10: 47: 46Z
  2. Я думаю, что вы имеете в виду, когда ваш текущий поток выходит, а не приложение, верно? Если приложение закрывается, другой поток не может использовать что-либо из него.
    2016-05-19 19: 28: 56Z

Когда мне нужен класс с полной функциональностью, например, Есть много методов и переменных, я использую синглтон;

Если я хочу, чтобы класс содержал только один или два метода, например, Класс MailService, который имеет только 1 метод SendMail () Я использую статический класс и метод.

    
1
2012-05-27 22: 42: 38Z

Как я понимаю разницу между классом Static и классом Non-Static Singleton, static - это просто неинстанцированный «тип» в C #, где Singleton является истинным «объектом». Другими словами, все статические члены в статическом классе присваиваются типу, но в Singleton размещаются под объектом. Но имейте в виду, что статический класс по-прежнему ведет себя как ссылочный тип, так как он не является типом значения, как Struct.

Это означает, что при создании Singleton, поскольку сам класс не является статическим, но его член является преимуществом, преимущество заключается в том, что статический член внутри Singleton, который ссылается на себя, связан с реальным «объектом», а не с пустым «типом» о себе. Такого рода теперь проясняется разница между статическим и нестатическим синглтоном за пределами его других функций и использования памяти, что меня смущает.

Оба используют статические элементы, которые являются единичными копиями элемента, но Singleton оборачивает указанный элемент вокруг истинного экземпляра «объекта», чей адрес существует в дополнение к его статическому элементу. Этот объект сам обладает свойствами, в которых можно передавать и ссылаться на него, добавляя ценность. Класс Static - это просто тип, поэтому он не существует, кроме как для указания на его статические члены. Эта концепция как бы скрепила назначение класса Singleton vs Static Class помимо наследования и других проблем.

    
1
2017-07-07 16: 42: 00Z
источник размещен Вот