设计模式是解决特定问题的一系列经过验证的解决方案。它们通常用于软件工程中的面向对象编程,可以帮助开发者创建可维护、可扩展和易于理解的代码。
设计模式可以分为三大类:
- 创建型模式:这类模式主要用于处理对象的创建机制,使得系统能够更加高效地创建对象。
- 结构型模式:这类模式主要用于处理类与对象的组合,通过这种方式可以使简单对象链接起来,从而满足用户的各种需求。
- 行为型模式:这类模式主要用于描述类或对象之间的交互以及职责分配。
创建型模式
单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点。这对于需要频繁实例化的类尤其有用。
实现单例模式
// www.javascriptcn.com code example
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() {}
}工厂方法模式
工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。
实现工厂方法模式
// www.javascriptcn.com code example
// 定义产品接口
interface Product {
public function use();
}
// 具体产品类A
class ConcreteProductA implements Product {
public function use() {
echo "使用产品A\n";
}
}
// 具体产品类B
class ConcreteProductB implements Product {
public function use() {
echo "使用产品B\n";
}
}
// 工厂类
abstract class Creator {
abstract public function factoryMethod();
public function someOperation() {
$product = $this->factoryMethod();
$product->use();
}
}
// 具体工厂类
class ConcreteCreatorA extends Creator {
public function factoryMethod() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
public function factoryMethod() {
return new ConcreteProductB();
}
}
// 使用示例
$creatorA = new ConcreteCreatorA();
$creatorA->someOperation(); // 输出: 使用产品A
$creatorB = new ConcreteCreatorB();
$creatorB->someOperation(); // 输出: 使用产品B结构型模式
装饰器模式
装饰器模式允许动态地为对象添加功能。它使用了“组合”而非“继承”,因此可以在运行时添加功能。
实现装饰器模式
// www.javascriptcn.com code example
// 抽象组件
interface Component {
public function operation();
}
// 具体组件
class ConcreteComponent implements Component {
public function operation() {
echo "具体组件的业务逻辑\n";
}
}
// 抽象装饰器
abstract class Decorator implements Component {
protected $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation() {
$this->component->operation();
}
}
// 具体装饰器A
class ConcreteDecoratorA extends Decorator {
public function operation() {
parent::operation();
echo "具体装饰器A附加的操作\n";
}
}
// 具体装饰器B
class ConcreteDecoratorB extends Decorator {
public function operation() {
parent::operation();
echo "具体装饰器B附加的操作\n";
}
}
// 使用示例
$component = new ConcreteComponent();
$decoratorA = new ConcreteDecoratorA($component);
$decoratorA->operation(); // 输出: 具体组件的业务逻辑 具体装饰器A附加的操作
$decoratorB = new ConcreteDecoratorB($component);
$decoratorB->operation(); // 输出: 具体组件的业务逻辑 具体装饰器B附加的操作行为型模式
观察者模式
观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
实现观察者模式
// www.javascriptcn.com code example
// 抽象主题
interface Subject {
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
// 具体主题
class ConcreteSubject implements Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers, true);
if ($index !== false) {
unset($this->observers[$index]);
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setState($state) {
$this->state = $state;
$this->notify();
}
public function getState() {
return $this->state;
}
}
// 抽象观察者
interface Observer {
public function update(Subject $subject);
}
// 具体观察者
class ConcreteObserver implements Observer {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function update(Subject $subject) {
echo $this->name . " 收到通知,状态改变为 " . $subject->getState() . "\n";
}
}
// 使用示例
$subject = new ConcreteSubject();
$observerA = new ConcreteObserver('观察者A');
$observerB = new ConcreteObserver('观察者B');
$subject->attach($observerA);
$subject->attach($observerB);
$subject->setState('初始状态');
$subject->setState('新状态'); // 输出: 观察者A 收到通知,状态改变为 新状态 观察者B 收到通知,状态改变为 新状态以上就是PHP设计模式的一些基本介绍和实现。这些模式不仅可以帮助你写出更好的代码,还能让你的代码更具可读性和可维护性。希望这个教程对你有所帮助!