1. 工厂模式
工厂模式是 PHP 中最常用的设计模式之一,它通过创建工厂类来实现对象的创建和初始化。工厂模式有三种常见的实现方式:
简单工厂模式
简单工厂模式是通过一个工厂类来创建各种不同类型的对象,根据不同的参数选择不同的实例化方式。它的核心是一个工厂类,包含一个创建对象的方法,根据传入的参数不同,返回不同类型的对象。
class SimpleFactory {
public static function createProduct($type) {
switch($type) {
case 'A':
return new ProductA();
break;
case 'B':
return new ProductB();
break;
default:
throw new Exception("Invalid type");
}
}
}
简单工厂模式通过传入参数来决定实例化哪个对象,调用方不需要了解具体的实例化细节,只需要知道调用的方法即可。
工厂方法模式
工厂方法模式通过定义一个用于创建对象的接口,让子类决定实例化哪个对象。工厂方法模式的核心是一个抽象工厂接口,具体的实例化由各个子类实现。
interface Factory {
public function createProduct();
}
class ProductAFactory implements Factory {
public function createProduct() {
return new ProductA();
}
}
class ProductBFactory implements Factory {
public function createProduct() {
return new ProductB();
}
}
工厂方法模式将对象的实例化由调用方移到了子类中,实现了调用方与具体产品的解耦。
抽象工厂模式
抽象工厂模式通过定义一个接口来创建一系列相关或依赖对象,而不指定具体的类名。抽象工厂模式提供了一种创建对象族的方法。
interface AbstractFactory {
public function createProductA();
public function createProductB();
}
class ConcreteFactory implements AbstractFactory {
public function createProductA() {
return new ConcreteProductA();
}
public function createProductB() {
return new ConcreteProductB();
}
}
抽象工厂模式将对象的创建过程封装在一个接口中,并且通过接口的实现类来创建具体的对象。调用方可以通过选择不同的工厂来创建不同类型的产品。
2. 单例模式
单例模式是一种只允许创建一个实例的设计模式。在 PHP 中,单例模式主要通过一个私有的构造方法和一个公有的静态方法来实现。
class Singleton {
private static $instance;
private function __construct() {
// 私有构造方法
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
}
在调用方需要使用单例对象时,只需要调用 Singleton::getInstance()
方法就可以获取到实例。
单例模式适用于需要全局唯一访问点的场景,比如数据库连接、日志记录等。
3. 代理模式
代理模式是一种对象结构型模式,它通过引入一个新的对象来间接访问原始对象,实现对原始对象的控制和扩展。
PHP 中的代理模式常常用于实现对象的延迟加载(Lazy Loading)。
interface Image {
public function display();
}
class RealImage implements Image {
private $fileName;
public function __construct($fileName) {
$this->fileName = $fileName;
$this->loadFromDisk();
}
private function loadFromDisk() {
// 从硬盘加载图片
}
public function display() {
// 显示图片
}
}
class ProxyImage implements Image {
private $fileName;
private $realImage;
public function __construct($fileName) {
$this->fileName = $fileName;
}
public function display() {
if (!$this->realImage) {
$this->realImage = new RealImage($this->fileName);
}
$this->realImage->display();
}
}
在调用方使用代理图片时,先创建代理对象,当调用 display()
方法时,如果真实图片对象不存在,会通过代理对象来创建真实图片对象并显示。
代理模式可以很好地实现对真实对象的控制和扩展,从而提供更灵活和可扩展的功能。
以上就是 PHP 中的三大经典模式的详解,包括工厂模式、单例模式和代理模式。它们可以帮助我们解决各种常见的设计问题,提高代码的可维护性和可拓展性。