微软的设计模式理论是:“文档引入模式,然后将它们呈现在一个存储库或目录中,这是为了帮助开发者找到解决问题的模式的正确组合。”
设计模式的例子
1. 单例
单例表示一个类只有一个实例,它提供了一个全局访问点,下面的代码将解释有关单例的概念。
<?php
class Singleton {
public static function getInstance() {
static $instance = null;
if (null === $instance) {
$instance = new Singleton();
}
return $instance;
}
protected function __construct() {
}
private function __clone() {
}
private function __wakeup() {
}
}
class SingletonChild extends Singleton {
}
$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance());
$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance());
var_dump($anotherObj === SingletonChild::getInstance());
?>
上面基于静态方法创建的例子是getInstance()
,执行上面示例代码,得到类似下面的结果 -
D:wampwwwindex.php:25:boolean true
D:wampwwwindex.php:28:boolean false
D:wampwwwindex.php:29:boolean true
2. 工厂
可以指定类然后创建该类的对象,这种设计模式叫作工厂设计模式,下面的例子将解释关于工厂设计模式。
<?php
class Automobile {
private $bikeMake;
private $bikeModel;
public function __construct($make, $model) {
$this->bikeMake = $make;
$this->bikeModel = $model;
}
public function getMakeAndModel() {
return 'Automobile: '.$this->bikeMake . ' ' . $this->bikeModel.' <br/>';
}
}
class Mobile {
private $bikeMake;
private $bikeModel;
public function __construct($make, $model) {
$this->bikeMake = $make;
$this->bikeModel = $model;
}
public function getMakeAndModel() {
return 'Common Mobile: '.$this->bikeMake . ' ' . $this->bikeModel.' <br/>';
}
}
class MobileFactory {
public static function create($mobile, $make, $model) {
return new $mobile($make, $model);
}
}
$pulsar = MobileFactory::create('Automobile', 'ktm', 'Pulsar');
print_r($pulsar->getMakeAndModel());
$pulsar = MobileFactory::create('Mobile', 'ktm2', 'Pulsar2');
print_r($pulsar->getMakeAndModel());
?>
执行上面示例代码,得到以下结果 -
Automobile: ktm Pulsar
Common Mobile: ktm2 Pulsar2
工厂模式的主要困难是增加了复杂性,对于优秀的程序员来说是不可靠的。
3. 策略模式
策略模式使得家族算法和封装每个算法。 在这里,每个算法在家族内应该是可互换的。
<?php
$elements = array(
array(
'id' => 2,
'date' => '2018-01-01',
),
array(
'id' => 1,
'date' => '2019-02-01'
)
);
$collection = new ObjectCollection($elements);
$collection->setComparator(new IdComparator());
$collection->sort();
echo "Sorted by ID:
";
print_r($collection->elements);
$collection->setComparator(new DateComparator());
$collection->sort();
echo "Sorted by date:
";
print_r($collection->elements);
?>
4. 模型视图控制器(MVC)
视图作为用户界面,模型行为作为后端,控制作为一个适配器。 这里有三个部分互相连接。 它将传递数据并访问彼此之间的数据。参考下图所示 -