Для создания новых объектов клиенту необязательно знать их конкретные классы.
Возможность гибкого управления процессом создания новых объектов за счет возможности динамических добавления и удаления прототипов в реестр.
Недостатки:
Каждый тип создаваемого продукта должен реализовывать операцию клонирования clone(). В случае, если требуется глубокое копирование объекта (объект содержит ссылки или указатели на другие объекты), это может быть непростой задачей.
Шаблон «Одиночка»
Часто в системе могут существовать сущности только в единственном экземпляре, например, система ведения системного журнала сообщений или драйвер дисплея. В таких случаях необходимо уметь создавать единственный экземпляр некоторого типа, предоставлять к нему доступ извне и запрещать создание нескольких экземпляров того же типа.
Шаблон «Одиночка» (Singleton) предоставляет такие возможности.
Для того, чтобы у класса существовал единственный экземпляр, необходимо запретить создавать экземпляр класса извне и контролировать единственность внутри кода самого класса.
Это обеспечивается при помощи следующего решения:
Рисунок 13 Диаграмма классов для реализации шаблона «Одиночка» Исходный код:
public class Singleton
{
private static Singleton _instance = null;
private Singleton()
{
}
public static Singleton GetInstance()
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
В данном примере реализован закрытый конструктор, который не даст создавать экземпляр класса извне.
Создание единственного экземпляра контролируется закрытым статическим полем _instance, которое инициализируется при первом обращении к получению экземпляра класса через метод GetInstance(), который предоставляет клиентам единственный экземпляр класса.