220 Часть 1 1 1 . Шаблоны
который автоматически генерирует файл класса. Вот пример класса, в который
включен признак типа протокола календаря.
class Settings {
static $СОММSТУРЕ = ' Bl oggs ' ;
Теперь, когда у нас есть значение параметра (хотя и сделанного неэлегантно),
можно создать класс, который использует его для принятия решения о том, какой
объект типа CoпunsManager нужно предоставить по запросу. В таких ситуациях часто
используют шаблон Singleton в сочетании с шаблоном Abstract Factory. поэтому да
вайте так и поступим.
require_once ( ' Settings . php ' ) ;
class AppConfi g {
private static $instance;
private $commsManager;
private function _construct ( )
11 Выполняется только один раз
$this->init ( ) ;
private funct ion init ( ) {
swi tch ( Sett i ngs : : $СОММSТУРЕ ) {
case ' Mega ' :
$this->commsManager = new MegaCommsManager ( ) ;
br e a k ;
default :
$this- >commsManager new BloggsCommsManager ( ) ;
puЫic static function get instance ( )
i f ( empty ( s e l f : : $ ins tance ) ) {
sel f : : $ instance = new sel f ( ) ;
return sel f : : $ i ns tance ;
puЫ ic function getCommsManager ( )
return $this->commsManager ;
Класс AppC o n f i g - это стандартный Singleton. Поэтому мы можем легко полу
чить ссылку на экземпляр App C on f i g в любом месте системы, причем всегда на один
и тот же экземпляр. Метод i n i t ( ) вызывается конструктором класса и поэтому за
пускается только один раз в процессе выполнения программы. В нем проверяется
свойство S e t t i n g s : : $СОММSТУРЕ, и в соответствии с его значением создается экзем
пляр конкретного объекта типа CoпunsMana g e r . Теперь наш сценарий может полу
чить объект типа CoпunsMa na g e r и работать с ним, даже не зная о его конкретных
реализациях или конкретных классах, которые он генерирует.
$ commsMgr = AppCon f i g : : getinstance ( ) - >getCommsManager ( ) ;
print $commsMgr- >getApptEncoder ( ) - >encode ( ) ;