Какой смысл делать конструктор класса закрытым и иметь метод getInstance, который возвращает новый экземпляр? Когда вы хотите разрешить только динамическое создание объектов и почему? Я видел примеры этого, и я не понимаю, почему.
Обычно это делается, когда экземпляры классов управляют своим временем жизни, например, они подпишутся на какое-то событие, которое происходит асинхронно. Если экземпляр был уничтожен до прибытия события, диспетчер событий использовал бы дикий указатель и вызвал бы неопределенное поведение.
Самый очевидный пример будет, если класс управляет своей собственной жизнью. Разрешение статического распределения приведет к двойному освобождению.
Обычно это потому, что программист хочет контролировать объекты, которые живы в любое время. Допустимые варианты использования:
образец Синглтона
поддержание неявного списка всех объектов живым, чтобы облегчить операции со всеми этими объектами
повторное использование объектов, которые уже живы
Последняя цель обычно также требует подсчета ссылок, чтобы иметь возможность уничтожать объекты, когда они больше не нужны, и требует, чтобы объекты были логически постоянными. Одним из применений этого является интернирование строк для повышения производительности (это позволяет сравнивать строки путем сравнения их указателей!).
Одна из причин может заключаться в том, что вы хотите управлять конкретным создаваемым типом как одним из нескольких возможных подтипов, о которых вызывающему приложению не нужно знать.
Например, вы можете получить Connection
скачать ресурс с URL
и URL
определит, какой конкретный тип Connection
возвращается — HTTPConnection
, HTTPSConnection
, FTPConection
так далее…