PHP常用设计模式
在软件开发中,设计模式是一套被开发者广泛接受的代码设计经验总结。它们为常见问题提供了通用可重用的解决方案,并且可以帮助我们编写出更清晰、更易于维护的代码。对于PHP开发者来说,掌握一些常用的设计模式是非常重要的,因为这不仅可以提升编码效率,还能帮助我们写出更加优雅和健壮的应用程序。本文将介绍几种PHP中常用的面向对象设计模式,并给出相应的实现步骤。
一、单例模式
介绍
单例模式是一种常用的创建型设计模式,它确保一个类只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式非常适合用于管理共享资源,比如数据库连接或配置信息等场景。
- 定义一个私有的构造函数防止外部直接创建该类的新实例。
- 创建一个静态私有属性用来保存唯一实例。
- 提供一个公共静态方法作为访问接口,该方法负责检查是否已经存在实例,如果不存在则创建一个新的;否则返回已存在的实例。
php深色版本1class Singleton {
2 private static $instance;
3
4 // 私有化构造函数
5 private function __construct() {}
6
7 // 防止克隆实例
8 private function __clone() {}
9
10 public static function getInstance() {
11 if (null === self::$instance) {
12 self::$instance = new self();
13 }
14 return self::$instance;
15 }
16}
二、工厂模式
介绍
工厂模式属于创建型模式的一种,它的主要作用是定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。通过使用工厂模式,可以隐藏具体的创建逻辑,从而提高系统的灵活性。
- 定义一个抽象基类或者接口。
- 实现多个具体产品类,这些类继承自上述定义的抽象基类或实现接口。
- 创建一个工厂类,其中包含一个或多个根据条件选择并生成对应具体产品对象的方法。
- 客户端代码只需要与工厂交互而不需要知道实际创建的是哪个具体的产品。
php深色版本1interface Logger {
2 public function log($message);
3}
4
5class FileLogger implements Logger {
6 public function log($message) {
7 file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
8 }
9}
10
11class ConsoleLogger implements Logger {
12 public function log($message) {
13 echo $message . PHP_EOL;
14 }
15}
16
17class LoggerFactory {
18 public static function getLogger($type) {
19 switch ($type) {
20 case 'file':
21 return new FileLogger();
22 case 'console':
23 return new ConsoleLogger();
24 default:
25 throw new Exception("Invalid logger type.");
26 }
27 }
28}
三、观察者模式
介绍
观察者模式是一种行为设计模式,允许你定义一个订阅机制,当某个对象的状态发生变化时能够自动通知所有依赖于它的其他对象。这种模式通常应用于事件驱动系统中,如用户界面更新或是状态监控等场景。
- 定义一个主题(Subject)接口或抽象类,它应该包含添加/删除观察者以及通知所有注册过的观察者的功能。
- 实现具体的主题类,此类需要维护一个观察者列表。
- 定义一个观察者(Observer)接口或抽象类,规定了接收通知的方法签名。
- 创建具体的观察者类,实现从观察者接口派生的具体行为。
- 在客户端代码中设置好主题与观察者之间的关系,并触发相应事件。
php深色版本1interface Observer {
2 public function update($message);
3}
4
5class ConcreteObserver implements Observer {
6 public function update($message) {
7 echo "Received: " . $message . PHP_EOL;
8 }
9}
10
11interface Subject {
12 public function attach(Observer $observer);
13 public function detach(Observer $observer);
14 public function notify($message);
15}
16
17class ConcreteSubject implements Subject {
18 private $observers = [];
19
20 public function attach(Observer $observer) {
21 $this->observers[] = $observer;
22 }
23
24 public function detach(Observer $observer) {
25 $key = array_search($observer, $this->observers, true);
26 if ($key !== false) {
27 unset($this->observers[$key]);
28 }
29 }
30
31 public function notify($message) {
32 foreach ($this->observers as $observer) {
33 $observer->update($message);
34 }
35 }
36}
四、策略模式
介绍
策略模式是一种行为设计模式,它让你能够在运行时改变对象的行为。这种模式适用于当你有许多相关类仅因其实现算法不同而有所区别时的情况。通过使用策略模式,可以将算法封装起来,并使其可以在客户端之间互换。
- 定义一个策略接口,声明执行特定算法所需的方法。
- 创建实现了策略接口的具体策略类。
- 定义上下文(Context)类,该类持有一个指向当前策略对象的引用,并通过委托给策略对象来执行实际的工作。
- 客户端可以选择合适的策略传递给上下文类,从而动态地改变上下文的行为。
php深色版本1interface ShippingStrategy {
2 public function calculate($weight);
3}
4
5class RegularShipping implements ShippingStrategy {
6 public function calculate($weight) {
7 return 5 + ($weight * 0.1);
8 }
9}
10
11class ExpressShipping implements ShippingStrategy {
12 public function calculate($weight) {
13 return 10 + ($weight * 0.2);
14 }
15}
16
17class Order {
18 private $shippingStrategy;
19
20 public function setShippingStrategy(ShippingStrategy $strategy) {
21 $this->shippingStrategy = $strategy;
22 }
23
24 public function calculateShippingCost($weight) {
25 return $this->shippingStrategy->calculate($weight);
26 }
27}
五、装饰器模式
介绍
装饰器模式是一种结构型设计模式,允许动态地向对象添加新的职责而不改变其原有的结构。装饰器模式提供了一种比继承更加灵活的方式来扩展对象的功能。它通常用于需要为现有功能增加额外行为的情境下。
- 定义一个组件接口或抽象类,表示要被装饰的对象。
- 创建具体组件类,实现基础功能。
- 设计一个装饰器基类,该类同样遵循组件接口,并保持对另一个组件实例的引用。
- 开发具体装饰器类,每个装饰器都增加了新行为。
- 在客户端代码中利用组合而非继承来构建复杂的对象结构。
php深色版本1interface Beverage {
2 public function cost();
3 public function getDescription();
4}
5
6class Coffee implements Beverage {
7 public function cost() {
8 return 1.99;
9 }
10
11 public function getDescription() {
12 return "Coffee";
13 }
14}
15
16abstract class CondimentDecorator implements Beverage {
17 protected $beverage;
18
19 public function __construct(Beverage $beverage) {
20 $this->beverage = $beverage;
21 }
22}
23
24class Milk extends CondimentDecorator {
25 public function cost() {
26 return $this->beverage->cost() + 0.50;
27 }
28
29 public function getDescription() {
30 return $this->beverage->getDescription() . ", Milk";
31 }
32}
以上介绍了五种常见的PHP设计模式及其简单的实现方式。每种模式都有其适用场景,在实际开发过程中合理运用这些设计模式能够显著改善程序的质量和可维护性。希望这篇文章能帮助你更好地理解和应用这些设计模式。