什么是设计模式
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
三种设计模式
模式分类 | 模式名称 |
---|---|
创建型 | 单例 , 原型 , 建造者 , 工厂 , 抽象工厂 ... |
结构型 | 桥接 , 外观 , 组合 , 装饰 , 适配器 , 代理 , 享元 ... |
行为型 | 迭代器 , 解释器 , 观察者 , 中介者 , 访问者 , 备忘录 , 状态 , 策略 , 模板方法 , 命令 , 职责链 ... |
下面简单的介绍下创造型的5大设计模式
部分代码来自实验楼16个PHP设计模式详解
工厂模式
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,
将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,
增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
class duck{
function __construct()
{
echo "i am duck";
}
}
class elephant{
function __construct()
{
echo "i am elephant";
}
}
class plant{
public static function create($name){
if(class_exists($name)){
return new $name;
}else{
die("not a class");
}
}
}
plant::create('elephant'); //i am elephant
plant::create('duck'); //i am duck
plant::create('1'); //not a class
抽象工厂
interface zoology{
public function run();
}
class duck implements zoology {
public $name = 'duck';
function __construct()
{
echo "i am {$this->name}";
}
function run()
{
// TODO: Implement run() method.
echo "{$this->name} running...";
}
}
class elephant implements zoology{
public $name = 'elephant';
function __construct()
{
echo "i am {$this->name}";
}
function run()
{
// TODO: Implement run() method.
echo "{$this->name} running...";
}
}
abstract class factory{
abstract function create($name);
}
//工厂所要做的就是创建实例
class plant extends factory{
public function create($name){
if(class_exists($name)){
return new $name;
}else{
echo("not a class");
}
}
}
$plant = new plant();
$plant->create('elephant'); //i am elephant
$plant->create('duck'); //i am duck
$plant->create('1'); //not a class
单例
三私一公, 一个类只创建一个对象
私有化 构造方法, 私有化 克隆, 私有化 静态 存储的对象, 公开 获取对象的入口
final class Single{
//私有可变实例化对象数组
private static $var = [];
//私有构造
private function __construct()
{
}
//私有克隆
private function __clone()
{
// TODO: Implement __clone() method.
}
//一个类只创建一个对象 , 并将其保存至上下文环境
public static function create($key){
if(!isset(Single::$var[$key])){
echo "\n实例化\n";
Single::$var[$key] = new $key;
}
echo "返回数据\n";
return Single::$var[$key];
}
}
$a = Single::create('worker');
$b = Single::create('worker');
var_dump($a , $b);
建造者
abstract class Builder
{
protected $car;
abstract public function buildPartA();
abstract public function buildPartB();
abstract public function buildPartC();
abstract public function getResult();
}
class CarBuilder extends Builder
{
function __construct()
{
$this->car = new Car();
}
public function buildPartA(){
$this->car->setPartA('发动机');
}
public function buildPartB(){
$this->car->setPartB('轮子');
}
public function buildPartC(){
$this->car->setPartC('其他零件');
}
public function getResult(){
return $this->car;
}
}
class Car
{
protected $partA;
protected $partB;
protected $partC;
public function setPartA($str){
$this->partA = $str;
}
public function setPartB($str){
$this->partB = $str;
}
public function setPartC($str){
$this->partC = $str;
}
public function show()
{
echo "这辆车由:".$this->partA.','.$this->partB.',和'.$this->partC.'组成';
}
}
class Director
{
public $myBuilder;
public function startBuild()
{
$this->myBuilder->buildPartA();
$this->myBuilder->buildPartB();
$this->myBuilder->buildPartC();
return $this->myBuilder->getResult();
}
public function setBuilder(Builder $builder)
{
$this->myBuilder = $builder;
}
}
$carBuilder = new CarBuilder();
$director = new Director();
$director->setBuilder($carBuilder);
$newCar = $director->startBuild();
$newCar->show();