PHP 设计模式
微软设计模式理论是 “该文档介绍了模式,然后在一个仓库或目录中展示它们,该目录的组织结构有助于您找到解决问题的正确模式组合”。
设计模式的示例
单例模式
一个类只有一个实例,它提供了对该实例的全局访问点。以下代码将解释单例模式的概念。
<?php
class Singleton {
public static function getInstance() {
static instance = null;
if (null ===instance) {
instance = new static();
}
returninstance;
}
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()
工厂模式
一个简单的类会创建对象,而您想要使用该对象。以下示例将说明工厂设计模式。
<?php
class Automobile {
private bikeMake;
privatebikeModel;
public function __construct(make,model) {
this->bikeMake =make;
this->bikeModel =model;
}
public function getMakeAndModel() {
return this->bikeMake . ' ' .this->bikeModel;
}
}
class AutomobileFactory {
public static function create(make,model) {
return new Automobile(make,model);
}
}
pulsar = AutomobileFactory::create('ktm', 'Pulsar');
print_r(pulsar->getMakeAndModel());
class Automobile {
private bikeMake;
privatebikeModel;
public function __construct(make,model) {
this->bikeMake =make;
this->bikeModel =model;
}
public function getMakeAndModel() {
return this->bikeMake . ' ' .this->bikeModel;
}
}
class AutomobileFactory {
public static function create(make,model) {
return new Automobile(make,model);
}
}
tpulsar = AutomobileFactory::create('ktm', 'pulsar');
print_r(pulsar->getMakeAndModel());
?>
工厂模式的主要困难在于会增加复杂性,并且对于优秀的程序员来说并不可靠。
策略模式
策略模式创建了算法家族,并封装了每个算法。在这里,每个算法都可以在家族内互相替换。
<?php
elements = array(
array(
'id' => 2,
'date' => '2011-01-01',
),
array(
'id' => 1,
'date' => '2011-02-01'
)
);collection = new ObjectCollection(elements);collection->setComparator(new IdComparator());
collection->sort();
echo "Sorted by ID:\n";
print_r(collection->elements);
collection->setComparator(new DateComparator());collection->sort();
echo "Sorted by date:\n";
print_r($collection->elements);
?>
模型视图控制
视图充当GUI,模型充当后端,控制器充当适配器。这三个部分相互连接。它们之间传递数据和访问数据。