說明:教學全部截選自實驗大樓教學【16個PHP設計模式詳解】:主要介紹16個常用的設計模式的基礎概念和技術要點,透過UML類別圖幫助理解設計模式中各個類別之間的關聯關係,針對每種設計模式都使用PHP完成了一個程式碼範例,讓你跟隨實例輕鬆入門設計模式。
工廠模式具體可分為三類模式:簡單工廠模式,工廠方法模式,抽象工廠模式;
又稱為靜態工廠方法(Static Factory Method)模式,它屬於類別創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類別的實例。簡單工廠模式專門定義一個類別來負責創建其他類別的實例,而被創建的實例通常都具有共同的父類別。
角色:
Factory類別:負責建立特定產品的實例
Product類別:抽象產品類,定義產品子類別的公共介面
ConcreteProduct 類別:具體產品類,實作Product父類別的介面功能,也可新增自訂的功能
UML類別圖:
#範例程式碼:
<?php //简单工厂模式 class Cat { function __construct() { echo "I am Cat class <br>"; } } class Dog { function __construct() { echo "I am Dog class <br>"; } } class Factory { public static function CreateAnimal($name){ if ($name == 'cat') { return new Cat(); } elseif ($name == 'dog') { return new Dog(); } } } $cat = Factory::CreateAnimal('cat'); $dog = Factory::CreateAnimal('dog');
簡單工廠模式最大的優點在於實現物件的創建和物件的使用分離,將物件的創建交給專門的工廠類別負責,但是其最大的缺點在於工廠類別不夠靈活,增加新的具體產品需要修改工廠類別的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。
此模式中,透過定義一個抽象的核心工廠類,並定義創建產品對象的接口,創建具體產品實例的工作延遲到其工廠子類去完成。這樣做的好處是核心類別只關注工廠類別的介面定義,而具體的產品實例交給特定的工廠子類別去創建。當系統需要新增一個產品是,無需修改現有系統代碼,只需要添加一個具體產品類和其對應的工廠子類,是系統的擴展性變得很好,符合面向對象編程的開閉原則;
角色:
Product:抽象產品類別
ConcreteProduct:具體產品類別
Factory:抽象工廠類別
ConcreteFactory:具體工廠類別
##UML類別圖:
範例程式碼:
<?php interface Animal{ public function run(); public function say(); } class Cat implements Animal { public function run(){ echo "I ran slowly <br>"; } public function say(){ echo "I am Cat class <br>"; } } class Dog implements Animal { public function run(){ echo "I'm running fast <br>"; } public function say(){ echo "I am Dog class <br>"; } } abstract class Factory{ abstract static function createAnimal(); } class CatFactory extends Factory { public static function createAnimal() { return new Cat(); } } class DogFactory extends Factory { public static function createAnimal() { return new Dog(); } } $cat = CatFactory::createAnimal(); $cat->say(); $cat->run(); $dog = DogFactory::createAnimal(); $dog->say(); $dog->run();
產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類別是電視機,其子類別有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而特定品牌的電視機是其子類。
產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器廠生產的海爾電視、海爾電冰箱,海爾電視機位於電視產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。
角色:
具体工厂(Factory):这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。
抽象产品(AbstractProduct):担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口
具体产品(Product):抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。
UML类图:
示例代码:
<?php interface TV{ public function open(); public function use(); } class HaierTv implements TV { public function open() { echo "Open Haier TV <br>"; } public function use() { echo "I'm watching TV <br>"; } } interface PC{ public function work(); public function play(); } class LenovoPc implements PC { public function work() { echo "I'm working on a Lenovo computer <br>"; } public function play() { echo "Lenovo computers can be used to play games <br>"; } } abstract class Factory{ abstract public static function createPc(); abstract public static function createTv(); } class ProductFactory extends Factory { public static function createTV() { return new HaierTv(); } public static function createPc() { return new LenovoPc(); } } $newTv = ProductFactory::createTV(); $newTv->open(); $newTv->use(); $newPc = ProductFactory::createPc(); $newPc->work(); $newPc->play();
又名:生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。
角色:
Builder:抽象构造者类,为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder:具体构造者类,实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口
Director:指挥者,构造一个使用Builder接口的对象。
Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
UML类图:
示例代码:
<?php /** * chouxiang builer */ abstract class Builder { protected $car; abstract public function buildPartA(); abstract public function buildPartB(); abstract public function buildPartC(); abstract public function getResult(); } class CarBuilder extends Builder { function __construct() { $this->car = new Car(); } public function buildPartA(){ $this->car->setPartA('发动机'); } public function buildPartB(){ $this->car->setPartB('轮子'); } public function buildPartC(){ $this->car->setPartC('其他零件'); } public function getResult(){ return $this->car; } } class Car { protected $partA; protected $partB; protected $partC; public function setPartA($str){ $this->partA = $str; } public function setPartB($str){ $this->partB = $str; } public function setPartC($str){ $this->partC = $str; } public function show() { echo "这辆车由:".$this->partA.','.$this->partB.',和'.$this->partC.'组成'; } } class Director { public $myBuilder; public function startBuild() { $this->myBuilder->buildPartA(); $this->myBuilder->buildPartB(); $this->myBuilder->buildPartC(); return $this->myBuilder->getResult(); } public function setBuilder(Builder $builder) { $this->myBuilder = $builder; } } $carBuilder = new CarBuilder(); $director = new Director(); $director->setBuilder($carBuilder); $newCar = $director->startBuild(); $newCar->show();
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
---维基百科
单例模式的要点有:某个类只能有一个实例;它必须自行创建本身的实例;它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。
角色:
Singleton:单例类
UML 类图:
示例代码:
<?php class Singleton { private static $instance; //私有构造方法,禁止使用new创建对象 private function __construct(){} public static function getInstance(){ if (!isset(self::$instance)) { self::$instance = new self; } return self::$instance; } //将克隆方法设为私有,禁止克隆对象 private function __clone(){} public function say() { echo "这是用单例模式创建对象实例 <br>"; } public function operation() { echo "这里可以添加其他方法和操作 <br>"; } } // $shiyanlou = new Singleton(); $shiyanlou = Singleton::getInstance(); $shiyanlou->say(); $shiyanlou->operation(); $newShiyanlou = Singleton::getInstance(); var_dump($shiyanlou === $newShiyanlou);
上述的五个模式均属于创建型模式,关于结构型模式,点击【16个PHP设计模式详解】即可查看了……
以上是總結php中16個設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!