PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
在PHP开发中,设计模式是一种很常见的编程思想。设计模式是对软件开发中经常出现的问题得出的通用解决方案。下面我将详细讲解PHP中三种常用的设计模式:单例模式、工厂模式、观察者模式。
单例模式
单例模式是一种创建型模式,它的目的是保证一个类只有一个实例,而且提供了一个全局访问该实例的方法。
下面是PHP单例模式的代码示例:
class Singleton
{
private static $instance;
private function __construct()
{
//构造函数私有化,避免外部创建实例
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
private function __clone()
{
//禁止克隆
}
private function __wakeup()
{
//禁止反序列化
}
}
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
var_dump($singleton1 === $singleton2); // true
在上面的示例代码中,使用了一个私有静态变量保存了该类的实例,然后提供了一个静态方法 getInstance()
来获取该实例。在 getInstance()
方法中先判断实例是否存在,如果不存在就创建该实例。同时将构造函数声明为私有,禁止外部创建这个类的实例,避免创建多个实例。
工厂模式
工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。工厂模式使用工厂方法来解决生成对象的问题,它通过工厂类来创建对象,而不需要直接调用类的构造函数。
下面是PHP工厂模式的代码示例:
interface Product
{
public function getName();
}
class ProductA implements Product
{
public function getName()
{
return "ProductA";
}
}
class ProductB implements Product
{
public function getName()
{
return "ProductB";
}
}
class ProductFactory
{
public function createProduct($type)
{
switch ($type) {
case 'A':
return new ProductA();
case 'B':
return new ProductB();
default:
throw new Exception("Invalid product type.");
}
}
}
$productFactory = new ProductFactory();
$productA = $productFactory->createProduct('A');
$productB = $productFactory->createProduct('B');
echo $productA->getName() . PHP_EOL; // ProductA
echo $productB->getName() . PHP_EOL; // ProductB
在上面的示例代码中,我们创建了一个 Product
接口,其中声明了 getName()
方法,然后分别创建了两个 Product
的实现类,ProductA
和 ProductB
实现了 Product
接口,并分别实现了 getName()
方法。最后创建了一个 ProductFactory
工厂类,它具有 createProduct()
方法,这个方法通过传递参数来创建不同类型的产品。如果传递的参数不在工厂类支持的产品类型中,则抛出一个异常。
观察者模式
观察者模式是一种行为型模式,当对象状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
下面是PHP观察者模式的代码示例:
interface Observer
{
public function update($data);
}
class ConcreteObserver1 implements Observer
{
public function update($data)
{
echo "ConcreteObserver1 has received data: " . $data . PHP_EOL;
}
}
class ConcreteObserver2 implements Observer
{
public function update($data)
{
echo "ConcreteObserver2 has received data: " . $data . PHP_EOL;
}
}
interface Subject
{
public function addObserver(Observer $observer);
public function removeObserver(Observer $observer);
public function notifyObservers($data);
}
class ConcreteSubject implements Subject
{
private $observers = array();
public function addObserver(Observer $observer)
{
$this->observers[] = $observer;
}
public function removeObserver(Observer $observer)
{
foreach ($this->observers as $key => $val) {
if ($val === $observer) {
unset($this->observers[$key]);
}
}
}
public function notifyObservers($data)
{
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();
$subject->addObserver($observer1);
$subject->addObserver($observer2);
$subject->notifyObservers('Hello world!');
$subject->removeObserver($observer1);
$subject->notifyObservers('Hello world again!');
在上面的示例代码中,我们创建了一个 Observer
接口,其中定义了 update()
方法,然后创建了两个具体的观察者 ConcreteObserver1
和 ConcreteObserver2
,它们实现了 Observer
接口,并分别实现了 update()
方法。接下来创建了一个 Subject
接口,定义了 addObserver()
、removeObserver()
和 notifyObservers()
方法。然后创建了一个具体的主题 ConcreteSubject
,实现了 Subject
接口,并实现了其中的方法。最后创建了一个观察者案例,先将两个观察者添加到主题中,然后调用 notifyObservers()
方法通知所有观察者,当主题状态改变时,观察者可以收到通知。最后再移除一个观察者并再次调用 notifyObservers()
方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】 - Python技术站