工厂方法模式的意义在于定义一个创建产品对象的工厂借口,将实际创建工作推迟到子类当中。核心工厂类不再负责创建产品,这样核心类成为一个抽象工厂角色,仅仅负责具体工厂子类必须实现的借口,这样进一步抽象化的好处是是的工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’(一个模块在扩展性上实现开放,而在更改性上实现闭合),实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
代码实现:
├── client.php 系统入口
├── Factory.class.php 抽象工厂类
├── Factory_GIF.class.php GIF工厂类
├── Factory_JPEG.class.php JPEG工厂类
├── Factory_PNG.class.php PNG工厂类
├── GIF.class.php PNG类
├── Image.class.php 业务继承类
├── JPEG.class.php JPEG类
└── PNG.class.php PNG类
对应UML图:
client.php
<?php
require 'Image.class.php';
require 'PNG.class.php';
require 'JPEG.class.php';
require 'GIF.class.php';
require 'Factory.class.php';
require 'Factory_PNG.class.php';
require 'Factory_GIF.class.php';
require 'Factory_JPEG.class.php';
$_png = new Factory_PNG();
echo $_png->getMessage();
echo "\n";
$_png_obj = $_png->getImage();
echo $_png_obj->getWidth();
echo "\n";
Factory.class.php
<?php
abstract class Factory{
abstract public function getMessage();
abstract public function getImage();
}
Factory_GIF.class.php
<?php
abstract class Factory{
abstract public function getMessage();
abstract public function getImage();
}
[root@ddcloud factory_method]# cat Factory_GIF.class.php
<?php
class Factory_GIF extends Factory{
public function getMessage(){
return "您将要处理GIF,是否要处理呢?";
}
public function getImage(){
return new GIF();
}
}
Factory_JPEG.class.php
<?php
class Factory_JPEG extends Factory{
public function getMessage(){
return "您将要处理JPEG,是否要处理呢?";
}
public function getImage(){
return new JPEG();
}
}
Factory_PNG.class.php
<?php
class Factory_PNG extends Factory{
public function getMessage(){
return "您将要处理PNG,是否要处理呢?";
}
public function getImage(){
return new PNG();
}
}
GIF.class.php
<?php
class GIF extends Image{
public function getWidth(){
return "GIF长度为300";
}
public function getHeight(){
return "GIF长度为330";
}
}
Image.class.php
<?php
abstract class Image{
abstract public function getWidth();
abstract public function getHeight();
}
JPEG.class.php
<?php
class JPEG extends Image{
public function getWidth(){
return "JPEG长度为200";
}
public function getHeight(){
return "JPEG长度为220";
}
}
PNG.class.php
<?php
class PNG extends Image{
public function getWidth(){
return "PNG长度为100";
}
public function getHeight(){
return "PNG长度为110";
}
}
总结:
我们把工厂类设置成抽象规范,让每个子类工厂去负责每个类对象的生成,这样提高了灵活性,提高了内聚,降低了耦合,但是客户端不够便捷,维护成本高。