提供一個建立一系列相關或互相依賴對象的接口。
注意:這裡和工廠方法的差別是:一系列(多個),而工廠方法隻有一個。
<?php
header('Content-type:text/html;charset=utf-8');
/*
* 抽象工廠模式
*/
/**
* Interface people 人類
*/
interface people
{
public function say();
}
/**
* Class OneMan 第一個男人類-繼承people
*/
class OneMan implements people
{
// 實作people的say方法
public function say()
{
echo '男1:我喜歡你<br>';
}
}
/**
* Class TwoMan 第二個男人類-繼承people
*/
class TwoMan implements people{
// 實作people的say方法
public function say()
{
echo '男2:我看上你了<br>';
}
}
/**
* Class OneWomen 第一個女人類-繼承people
*/
class OneWomen implements people {
// 實作people的say方法
public function say()
{
echo '女1:我不喜歡你<br>';
}
}
/**
* Class TwoWomen 第二個女人類-繼承people
*/
class TwoWomen implements people {
// 實作people的say方法
public function say()
{
echo '女2:滾一邊玩去<br>';
}
}
/**
* Interface createPeople 建立對象類
* 注意:這裡将對象的建立抽象成了一個接口。
*/
interface createPeople
{
// 建立第一個
public function createOne();
// 建立第二個
public function createTwo();
}
/**
* Class FactoryMan 用于建立男人對象的工廠類-繼承createPeople
*/
class FactoryMan implements createPeople
{
// 建立第一個男人
public function createOne()
{
return new OneMan();
}
// 建立第二個男人
public function createTwo()
{
return new TwoMan();
}
}
/**
* Class FactoryWomen 用于建立女人對象的工廠類-繼承createPeople
*/
class FactoryWomen implements createPeople
{
// 建立第一個女人
public function createOne()
{
return new OneWomen();
}
// 建立第二個女人
public function createTwo()
{
return new TwoWomen();
}
}
/**
* Class Client 執行測試類
*/
class Client {
// 具體生成對象和執行方法
public function test() {
// 男人
$factory = new FactoryMan();
$man = $factory->createOne();
$man->say();
$man = $factory->createTwo();
$man->say();
// 女人
$factory = new FactoryWomen();
$man = $factory->createOne();
$man->say();
$man = $factory->createTwo();
$man->say();
}
}
// 執行
$demo = new Client;
$demo->test();
結果:
男:我喜歡你
男:我看上你了
女:我不喜歡你
女:滾一邊玩去
差別
- 簡單工廠模式(靜态方法工廠模式) : 用來生産同一等級結構中的任意産品。(不能增加新的産品)
- 工廠模式 :用來生産同一等級結構中的固定産品。(支援增加任意産品)
- 抽象工廠 :用來生産不同産品種類的全部産品。(不能增加新的産品,支援增加産品種類)
适用範圍
簡單工廠模式:
工廠類負責建立的對象較少,操作時隻需知道傳入工廠類的參數即可,對于如何建立對象過程不用關心。
工廠方法模式:
滿足以下條件時,可以考慮使用工廠模式方法
- 當一個類不知道它所必須建立對象的類時
- 一個類希望由子類來指定它所建立的對象時
- 當類将建立對象的職責委托給多個幫助子類中得某一個,并且你希望将哪一個幫助子類是代理者這一資訊局部化的時
抽象工廠模式:
滿足以下條件時,可以考慮使用抽象工廠模式
- 系統不依賴于産品類執行個體如何被建立,組合和表達的細節。
- 系統的産品有多于一個的産品族,而系統隻消費其中某一族的産品
- 同屬于同一個産品族是在一起使用的。這一限制必須在系統的設計中展現出來。
- 系統提供一個産品類的庫,所有産品以同樣的接口出現,進而使用戶端不依賴于實作。
以上幾種,歸根結底,都是将重複的東西提取出來,以友善整體解耦和複用,修改時友善。可根據具體需求而選擇使用。