在現實生活中社會分工越來越細,越來越專業化。各種產品有專門的工廠生產,徹底告別了自給自足的小農經濟時代,這大大縮短了產品的生產周期,提高了生產效率。同樣,在軟件開發中能否做到軟件對象的生產和使用相分離呢?能否在滿足“開閉原則”的前提下,客戶隨意增刪或改變對軟件相關對象的使用呢?這就是本節要討論的問題。
簡單工廠模式違背了開閉原則,而“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的產品,即滿足開閉原則。
#### 優點:
* 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程。
* 靈活性增強,對于新產品的創建,只需多寫一個相應的工廠類。
* 典型的解耦框架。高層模塊只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。
#### 缺點:
* 類的個數容易過多,增加復雜度
* 增加了系統的抽象性和理解難度
* 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決。
#### 應用場景:
* 客戶只知道創建產品的工廠名,而不知道具體的產品名。如 TCL 電視工廠、海信電視工廠等。
* 創建對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供創建產品的接口。
* 客戶不關心創建產品的細節,只關心產品的品牌
## 模式的結構與實現
工廠方法模式由抽象工廠、具體工廠、抽象產品和具體產品等4個要素構成。本節來分析其基本結構和實現方法。
#### 1\. 模式的結構
工廠方法模式的主要角色如下。
1. 抽象工廠(Abstract Factory):提供了創建產品的接口,調用者通過它訪問具體工廠的工廠方法 newProduct() 來創建產品。
2. 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的創建。
3. 抽象產品(Product):定義了產品的規范,描述了產品的主要特性和功能。
4. 具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間一一對應。
```
<?php
//抽象產品
namespace Factory\SimpleFactory;
interface IShape {
public draw();
}
```
```
<?php
//具體產品
namespace Factory\SimpleFactory;
class Square implements IShape
{
public function draw()
{
return '畫一個正方形';
}
}
```
```
<?php
//具體產品
namespace Factory\SimpleFactory;
class Circle implements IShape
{
public function draw()
{
return '畫一個圓形';
}
}
```
```
<?php
namespace Factory\SimpleFactory;
//抽象工廠:提供了廠品的生成方法
interface AbstractFactory {
public newShap();
}
```
```
<?php
//具體工廠
namespace Factory\SimpleFactory;
class CircleFactory implements AbstractFactory {
public function newShap(){
return new Circle();
}
}
```
```
<?php
//具體工廠
namespace Factory\SimpleFactory;
class SquareFactory implements AbstractFactory {
public function newShap(){
return new Square();
}
}
```
```
<?php
// client 調用方式, 可以解決簡單工廠違背開閉原則的問題
namespace Factory\SimpleFactory;
$shape = (new CircleFactory())->newShap();
$sting = $shape->draw();
echo $sting;
```
- 序言
- 從業感悟
- 常用名詞
- HTML
- JS
- ES6新特性
- jquery和vue對比
- 徹底理解this
- JQuery添加自定義函數
- js的實現
- 原始值和引用值
- MYSQL
- 簡介
- 術語
- 特點
- 范式
- 數據類型1
- 數據類型2
- 編碼
- 權限管理
- 事務
- mvvc
- 引擎
- MyISAM與InnoDB區別
- 索引類型
- 鎖
- 死鎖
- 分層架構
- 執行計劃
- join原理
- 高可用
- 日志類型
- 分庫分表
- 中間件
- 服務器
- 操作系統
- 信號量 鎖 隊列
- PHP
- composer加載原理
- composer基礎知識
- 自動加載函數
- composer加載代碼
- composer 自動加載
- 內存管理
- PHP執行流程
- cgi,fastCgi,php-fpm
- HTTP
- 錯誤碼
- 跨域請求
- 面試
- 安全
- HTTP劫持
- 設計模式
- 如何正確的使用設計模式
- 單例模式
- 原型模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 建造者模式
- 設計原則
- 算法
- PHP短標簽