Программная инженерия Андрей Дмитриев ©
Шаблоны проектирования
Одиночка (Singleton) Это реализация класса, экземпляров которого не может быть больше одного. Часто используется для организации доступа к одному и тому же набору данных из нескольких других классов.
Одиночка (попытка 1) public class Singleton { public final static Singleton instance = new Singleton(); public static void main(String [] s) { Singleton st = new Singleton(); if (st == Singleton.instance){ System.out.println("equality"); } else { System.out.println("inequality"};
Одиночка (попытка 2) private Singleton(){} //определим конструктор, таким образом, удалив конструктор по умолчанию(public) public static void main(String [] s) { Singleton st = new Singleton(); if (st == Singleton.instance){ System.out.println("equality"); } else { System.out.println("inequality"); }
Одиночка (попытка 3) public class RunSingleton { public static void main(String [] s) { Singleton st = new Singleton(); //ошибка if (st == Singleton.instance){ System.out.println("equality"); } else { System.out.println("inequality"); }
Одиночка (реализация) public class PrintSpooler { private static PrintSpooler spooler; private PrintSpooler() { //прячем конструктор} public static synchronized PrintSpooler getSpooler(){ if (spooler == null) //инициализируем экземпляр если это первый вызов spooler = new PrintSpooler(); return spooler; // возвращаем статический экземпляр } public void print(String s){ System.out.println(s); } }
Одиночка (не перекрытый конструктор) public Spooler() throws SingletonException{ //Контроль с открытым конструктором if(instance_flag) throw new SingletonException(…); else instance_flag = true; //устанавливаем контролирующий флаг System.out.println("printer opened"); }
Одиночка (выводы) Легко расширить класс до возможности существования более одного экземпляра. Реализация наследование от класса-одиночки требует глубокого анализа. PrintSpooler pr3 = new PrintSpooler(); //ошибка компиляции
Q&A
Спасибо! Андрей Дмитриев ©