点评:不能随意创建对象,只能通过Preferences::getInstance()来创建对象。
工厂模式
<?php
abstract class ApptEncoder {
abstract function encode();
}
class BloggsApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in BloggsCal formatn";
}
}
class MegaApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in MegaCal formatn";
}
}
class CommsManager { // 负责生产Bloggs对象
function getApptEncoder() {
return new BloggsApptEncoder();
}
}
$obj = new CommsManager();
$bloggs = $obj->getApptEncoder(); // 获取对象
print $bloggs->encode();
?>
output:
Appointment data encoded in BloggsCal format
进一步增加灵活性设置
<?php
abstract class ApptEncoder {
abstract function encode();
}
class BloggsApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in BloggsCal formatn";
}
}
class MegaApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in MegaCal formatn";
}
}
class CommsManager {
const BLOGGS = 1;
const MEGA = 2;
private $mode ;
function __construct( $mode ) {
$this->mode = $mode;
}
function getHeaderText() {
switch ( $this->mode ) {
case ( self::MEGA ):
return "MegaCal headern";
default:
return "BloggsCal headern";
}
}
function getApptEncoder() {
switch ( $this->mode ) {
case ( self::MEGA ):
return new MegaApptEncoder();
default:
return new BloggsApptEncoder();
}
}
}
$man = new CommsManager( CommsManager::MEGA );
print ( get_class( $man->getApptEncoder() ) )."n";
$man = new CommsManager( CommsManager::BLOGGS );
print ( get_class( $man->getApptEncoder() ) )."n";
?>
output:
MegaApptEncoder
BloggsApptEncoder
工厂方法模式要把创建者类与要生产的产品类分离开来。
抽象工厂
通过抽象来来约束,成为一定的规矩。
<?php
abstract class ApptEncoder {
abstract function encode();
}
class BloggsApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in BloggsCal formatn";
}
}
class MegaApptEncoder extends ApptEncoder {
function encode() {
return "Appointment data encoded in MegaCal formatn";
}
}
abstract class CommsManager { // 预约
abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getTtdEncoder();
abstract function getContactEncoder();
abstract function getFooterText();
}
class BloggsCommsManager extends CommsManager {
function getHeaderText() {
return "BloggsCal headern";
}
function getApptEncoder() {
return new BloggsApptEncoder();
}
function getTtdEncoder() {
return new BloggsTtdEncoder();
}
function getContactEncoder() {
return new BloggsContactEncoder();
}
function getFooterText() {
return "BloggsCal footern";
}
}
class MegaCommsManager extends CommsManager {
function getHeaderText() {
return "MegaCal headern";
}
function getApptEncoder() {
return new MegaApptEncoder();
}
function getTtdEncoder() {
return new MegaTtdEncoder();
}
function getContactEncoder() {
return new MegaContactEncoder();
}
function getFooterText() {
return "MegaCal footern";
}
}
$mgr = new MegaCommsManager();
print $mgr->getHeaderText();
print $mgr->getApptEncoder()->encode(); // 对象调用方法,返回对象,继续调用方法。
print $mgr->getFooterText();
?>







