1 单例模式
一个类只允许创建一个对象
应用场景:多次请求数据库只需要一个连接对象。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
1、私有的静态属性来保存对象的实例
2、私有的构造函数阻止类的外部实例化对象
3、私有的__clone()函数阻止类的外部克隆对象
4、公有的静态函数保证外部获取对象单例。
代码实现
<?php
class Exam{
private static $instance;//创建静态变量来保存实例化对象
private function __construct(){//私有的构造函数阻止类的外部实例化对象
}
private function __clone()//私有的克隆函数阻止类的外部克隆对象
{
// TODO: Implement __clone() method.
}
public static function get_instance(){//公有的静态函数保证外部获取实例化对象。
if (!self::$instance instanceof self) //判断该静态变量是否为该类的实例
self::$instance = new self();//若不是该类的实例就实例化对象
return self::$instance;//是该类的对象直接返回,保证了单例的实现
}
}
2 工厂模式
具体就是传递不同的参数生成不同的对象
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
代码:
<?php
class ProductA{
}
class ProductB{
}
//传递的参数为变量,当变量不一样时返回不一样的对象
class Factory{
public function create($num){
switch ($num){
case 1 :
return new ProductA();
case 2:
return new ProductB();
default:
return null;
}
}
}
3 策略模式
传递不同的参数调用不同的策略(方法)
<?php
class Walk{
public function way(){
echo "walk";
}
}
class Bus{
public function way(){
echo "bus";
}
}
//传递的参数为对象传递不一样的对象会调用不同的方法
class Student{
public function how($obj){
$obj->way();
}
}
4、装饰器模式
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵··活。
<?php
class BaseArt{
protected $content;//存放文章内容
protected $art = null;//存放文章对象
public function __construct($content){
$this->content = $content; //构造基础文章
}
public function decorator(){
return $this->content;//返回文章内容
}
}
class BianArt extends BaseArt{ //创建小编类
public function __construct(BaseArt $art){
$this->art = $art;//实例化小编类时需要传递基础文章类对象作为参数
$this->decorator();//返回修饰完成之后的文章
}
public function decorator(){
return $this->content = $this->art->decorator() . '小编摘要'; //返回构造函数是传递过来的文章类的文章在加上修饰的部分赋值给当前对象的文章内容并返回。
}
}
class SEOArt extends BaseArt{
public function __construct(BaseArt $art){
$this->art = $art;
$this->decorator();
}
public function decorator(){
return $this->content = $this->art->decorator() . 'SEO';
}
}
$a = new BaseArt('文章');
echo $a->decorator(); //文章
$b = new BianArt($a);
echo $b->decorator(); //文章小编摘要
$c = new SEOArt($b);
echo $c->decorator();//文章小编摘要SEO
$d = new SEOArt($a);
echo $d->decorator();//文章SEO
5、建造者模式
使用场景:如果你需要将一个复杂对象的构建与它的 表示分离,使得同样的构建过程可以创建不同的表示 的意图时,我们 需要应用于一个设计模式,‘建造者(Builder)模式’
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、游戏中的人物模型、小人的‘过程’是稳定的,都需要头、身、手、脚,而具体建造的‘细节’是不同的,有胖有瘦有高有矮。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
6、原型模式
**使用场景:**原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
7、观察者模式
**使用场景:**定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
**应用实例:**1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制