1.抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。
這種類型的設計模式屬於創建型模式,它提供瞭一種創建對象的最佳方式。
工廠模式是我們最常用的實例化對象模式,是用工廠方法代替new操作的一種模式。
使用工廠模式的好處是,如果你想要更改所實例化的類名等,則隻需更改該工廠方法內容即可,不需逐一尋找代碼中具體實例化的地方(new處)修改瞭。
為系統結構提供靈活的動態擴展機制,減少瞭耦合。
抽象多個工廠;
<?php
/*
interface是完全抽象的,隻能聲明方法,而且隻能聲明 public 的方法,不能聲明 private 及 protected 的方法
不能定義方法體,也不能聲明實例變量 。 interface 卻可以聲明常量變量 。
*/
interface Car
{
const BIG=100; //
public function getWidth(); //獲取車寬度 不允許用private和protected修飾
public function getHeight();//獲取車高度
}
interface Colors
{
public function setColor($c);
public function getColor();
}
/**
抽象工廠類的定義;必須實現車和顏色的interface接口
1.抽象類是和抽象方法
2.抽象類不能被直接實例化即new;抽象類中隻定義(或部分實現)子類需要的方法。
子類可以通過繼承抽象類並通過實現抽象類中的所有抽象方法,使抽象類具體化。
3.子類必須實現抽象類利所有抽象方法
4.抽象方法隻能用public 和protected修飾
**/
abstract class AbstractFactory implements Car,Colors
{
//獲取車的屬性
abstract public function getWidth();
abstract public function getHeight();
//獲取車顏色
abstract public function setColor($c);
abstract public function getColor();
public function getName(){
return '寶馬';
}
}
/*
子類必須實現父類的抽象方法和接口的方法
*/
class CarFactory extends AbstractFactory
{
protected $car_color;
protected $h;
protected $w;
public function getWidth()
{
return 1000;
}
public function getHeight()
{
return 200;
}
public function setColor($c){
}
public function getColor(){
return null;
}
}
/*
子類必須實現父類的抽象方法和接口的方法
*/
class ColorFactory extends AbstractFactory
{
protected $car_color;
protected $h;
protected $w;
public function getWidth()
{
return null;
}
public function getHeight()
{
return null;
}
public function setColor($c){
$this->car_color = $c;
}
public function getColor(){
return $this->car_color;
}
}
//實現生產車的類
class ProductCar
{
public static function getFactory($type){
if($type=='car'){
return new CarFactory();
}elseif($type=='color'){
return new ColorFactory();
}
}
}
//開始使用
//獲取車屬性
$fac_car = ProductCar::getFactory('car');
echo $fac_car->getWidth();
//後去顏色屬性
$fac_color = ProductCar::getFactory('color');
$fac_color->setColor('紅色');
echo $fac_color->getColor();
?>