工廠方法模式的意義在於定義一個創建產品對象的工廠藉口,將實際創建工作推遲到子類當中。核心工廠類不再負責創建產品,這樣核心類成爲一個抽象工廠角色,僅僅負責具體工廠子類必須實現的藉口,這樣進一步抽象化的好處是是的工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’(一個模塊在擴展性上實現開放,而在更改性上實現閉合),實現了可擴展。其次更復雜的層次結構,可以應用於產品結果複雜的場合。
代碼實現:
├── 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";
}
}
總結:
我們把工廠類設置成抽象規範,讓每個子類工廠去負責每個類對象的生成,這樣提高了靈活性,提高了內聚,降低了耦合,但是客戶端不夠便捷,維護成本高。