抽象工厂模式实现了
1.将系统与实现的细节分离,我们可以在实例中添加或移除任意一个编码格式,而不会影响系统
2.对系统中功能相关的元素强制进行组合,因此,通过使用BloggsCommsManager可以确保只使用与BloggsCal相关的类
3.添加新产品将会令人苦恼,因为不仅要创建新产品的具体实现,而且为了支持他,我们必须修改抽象创建者和他的每一个具体实现
<?php
/**
* 抽象工厂模式实现了
* 1.将系统与实现的细节分离,我们可以在实例中添加或移除任意一个编码格式,而不会影响系统
* 2.对系统中功能相关的元素强制进行组合,因此,通过使用BloggsCommsManager可以确保只使用与BloggsCal相关的类
* 3.添加新产品将会令人苦恼,因为不仅要创建新产品的具体实现,而且为了支持他,我们必须修改抽象创建者和他的每一个具体实现
*/
//预约
abstract class ApptEncoder{
abstract function encode();
}
//待办事宜
abstract class TtdEncoder{
abstract function encode();
}
//联系人
abstract class ContactEncoder{
abstract function encode();
}
//日历格式的编码器
class BloggsApptEncoder extends ApptEncoder{
function encode(){
return "预约编码格式 BloggsAppt <br>";
}
}
//Mega格式的编码器
class BloggsContactEncoder extends ContactEncoder{
function encode(){
return "联系人编码格式 BloggsContact <br>";
}
}
class BloggsTtdEncoder extends TtdEncoder{
function encode(){
return "代办事宜编码格式 BloggsTtd <br>";
}
}
//抽象管理员类 抽象工厂类
/* abstract class CommsManager{
abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getTtdEncoder();
abstract function getContactEncoder();
abstract function getFooterText();
} */
abstract class CommsManager{
const APPT=1;
const TTD=2;
const CONTACT=3;
abstract function getHeaderText();
abstract function make($flag_int);
abstract function getFooterText();
}
/* class BloggsCommsManager extends CommsManager{
function getHeaderText(){
return "BloggsCal header<br>";
}
//下面3个方法使用了工厂方法
function getApptEncoder(){
return new BloggsApptEncoder();
}
function getTtdEncoder(){
return new BloggsTtdEncoder();
}
function getContactEncoder(){
return new BloggsContactEncoder();
}
function getFooterText(){
return "BloggsCal footer <br>";
}
} */
class BloggsCommsManager extends CommsManager{
function getHeaderText(){
return "BloggsCal header <br>";
}
function make($flag_int){
switch ($flag_int){
case self::APPT:
return new BloggsApptEncoder();
case self::CONTACT:
return new BloggsContactEncoder();
case self::TTD:
return new BloggsTtdEncoder();
}
}
function getFooterText(){
return "BloggsCal footer <br>";
}
}
$bloggs=new BloggsCommsManager();
print $bloggs->make(2)->encode();
抽象工厂的作用
首先,将系统与实现的细节分离开来。我们可以在实例中添加或移除任意一个编码格式
而不会影响系统
对系统中功能相关的元素强制进行组合。因此,通过使用 BloggsCommsManager,可以确保
只使用与BloggsCal相关的类
添加新产品将会令人恼。因为不仅要创建新产品的具体实现,而且为了支持它,我们
必须修改抽象创建者和它的每一个具体实现