工厂模式中的工厂是做什么的呢?工厂是用来制造对象的!这点是必须要明白的。
例子简单说明下是利用不用编码格式实现消息通讯。着重注意产品类和制造类的关系,其他工厂模式会有不同。
<?php
/**
* 编码器
* Class AppEncoder
*/
abstract class AppEncoder{
abstract function encode();
}
/**
* Bloggs的编码格式
* 产品类
* Class BloggsAppEncoder
*/
class BloggsAppEncoder extends AppEncoder {
function encode()
{
return 'BloggsCal的格式';
}
}
/**
* Mega的编码格式
* 产品类
* Class MegaAppEncoder
*/
class MegaAppEncoder extends AppEncoder{
function encode()
{
return 'MegaCal的格式';
}
}
/**
* 制造者类
* 通讯消息
* Class CommsManager
*/
class CommsManager{
const BLOGGS = 1;
const MEGA = 2;
private $mode = 1;
function __construct($mode){
$this->mode = $mode;
}
/**
* 生成解码器对应的页眉
*/
public function getHeaderText()
{
switch( $this->mode ) {
case ( self::MEGA ):
return "MegaCal header";
default:
return "BloggsCal header";
}
}
/**
* 生成解码器
*/
function getAppEncoder(){
switch ($this->mode){
case self::BLOGGS:
return new BloggsAppEncoder();
default:
return new MegaAppEncoder();
}
}
}
$CommsManager = new CommsManager(CommsManager::BLOGGS);
$res = $CommsManager->getAppEncoder();
print $res->encode();
我们可以看出getHeaderText与getAppEncoder中我们使用了相同的判断方法。如果我们还要加入getFooterText工作量就会更大。
总结一下问题:
- 在代码运行时我们才知道要生成的对象类型MegaAppEncoder/BloggsAppEncoder
- 我们需要可以轻松添加一些新的产品类型getFooterText。
- 每一个产品我们都能定制不同的产品类型getHeaderText。
带着这些问题我们进入 工厂方法模式 。