设计模式

php关键字

abstract(抽象) :

用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
抽象方法是只有方法声明,而没有方法的实现内容。
抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。
interface (接口):

如果一个抽象类里的所有方法都是抽象方法,且没有声明变量,所有成员都是public权限,那么这种特殊的抽象类就叫 接口
interface即PHP接口,并用关键字implements来实现接口中方法,且必须完全实现
implements(实施,实现) :
implements是实现多个接口,接口的方法一般为空,必须重写才能使用
extends(继承) :
extends是继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,如果类被声明为final,则不能被继承

1.工厂模式分类

工厂模式具体可分为三类模式:简单工厂模式,工厂方法模式,抽象工厂模式;

1.1. 简单工厂模式

又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

优点: 实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责.

缺点: 工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂.

php示例代码:
#Factory.class.php
<?php 
  //简单工厂模式
  class Cat
  {
      function __construct()
      {
          echo "I am Cat class <br>";
      }
  }
  class Dog
  {
      function __construct()
      {
          echo "I am Dog class <br>";
      }
  }
  class Factory
  {
      public static function CreateAnimal($name){
          
          if ($name == 'cat') {
              return new Cat();
          } elseif ($name == 'dog') {
              return new Dog();
          }
      }
  }

  $cat = Factory::CreateAnimal('cat');
  $dog = Factory::CreateAnimal('dog');

1.2. 工厂方法模式

此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则;

php示例代码
#ConcreteFactory.class.php:
<?php 
interface Animal{
    public function run();
    public function say();
}
class Cat implements Animal
{
    public function run(){
        echo "I ran slowly <br>";
    }
    public function say(){
        echo "I am Cat class <br>";
    }
}
class Dog implements Animal
{
    public function run(){
        echo "I'm running fast <br>";
    }
    public function say(){
        echo "I am Dog class <br>";
    }
}
abstract class Factory{
    abstract static function createAnimal();
}
class CatFactory extends Factory
{
    public static function createAnimal()
    {
        return new Cat();
    }
}
class DogFactory extends Factory
{
    public static function createAnimal()
    {
        return new Dog();
    }
}

$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();

$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();
//I am Cat class 
//I ran slowly 
//I am Dog class 
//I'm running fast 

1.3. 抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

php示例代码:
 #AbstructFactory.class.php
<?php 

interface TV{
  public function open();
  public function watch();
}

class HaierTv implements TV
{
  public function open()
  {
      echo "Open Haier TV <br>";
  }

  public function watch()
  {
      echo "I'm watching Haier TV <br>";
  }
}

class LenovoTv implements TV
{
  public function open()
  {
      echo "Open Lenovo TV <br>";
  }

  public function watch()
  {
      echo "I'm watching Lenovo TV <br>";
  }
}

interface PC{
  public function work();
  public function play();
}

class LenovoPc implements PC
{
  public function work()
  {
      echo "I'm working on a Lenovo computer <br>";
  }
  public function play()
  {
      echo "Lenovo computers can be used to play games <br>";
  }
}

class HaierPc implements PC
{
  public function work()
  {
      echo "I'm working on a Haier computer <br>";
  }
  public function play()
  {
      echo "Haier computers can be used to play games <br>";
  }
}

abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}

class HaierFactory extends Factory
{
    public static function createTv()
    {
        return new HaierTv();
    }

    public static function createPc()
    {
        return new HaierPc();
    }

}

class LenovoFactory extends Factory
{
    public static function createTv()
    {
        return new LenovoTv();
    }

    public static function createPc()
    {
        return new LenovoPc();
    }

}

$haierFactory = new HaierFactory();
$haierTv = $haierFactory->createTv();
$haierTv->open();
$haierTv->watch();

$haierPc = $haierFactory->createPc();
$haierPc->work();
$haierPc->play();

$lenovoFactory = new LenovoFactory();
$lenovoPc = $lenovoFactory->createPc();
$lenovoPc->work();
$lenovoPc->play();

$lenovoTv = $lenovoFactory->createTv();
$lenovoTv->open();
$lenovoTv->watch();

2.单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.

单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。
单例模式有以下3个特点:
1.只能有一个实例。
2.必须自行创建这个实例。
3.必须给其他对象提供这一实例。

为什么要使用PHP单例模式?

PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

然而,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复 ,虽然有时候会有些鸡肋。
在不使用单例的情况下我们在一个类里面操作数据库可能是这样的:

<?php
/**
*  单例模式
**/
class Db
{
  //保存全局实例
  private static $instance;
  //数据库连接句柄
  private $db;
  //数据库连接参数
  //const HOSTNAME = "127.0.0.1";
  //const USERNAME = "root";
  //const PASSWORD = "123456";
  //const DBNAME = "testdb";
  //私有化构造函数,防止外界实例化对象
  private function __construct()
  {
    $this->db = mysqli_connect( '127.0.0.1', 'root', '123456', 'testdb');
  }
    
  //私有化克隆函数,防止外界克隆对象
  private function __clone() {}
    
  //单例访问统一入口
  public static function getInstance()
  {
    if(!(self::$instance instanceof self))
    {
      self::$instance = new self();
    }
    return self::$instance;
  }
  //数据库查询操作
  public function getinfo()
  {
    $sql = "select * from testtb";
    $res = mysqli_query($this->db,$sql);
    while($row = mysqli_fetch_array($res)) {
      echo $row['testcol'] . '<br />';
    }
    mysqli_free_result($res);
  }
}
$mysqli = Db::getInstance();
$mysqli->getinfo();
?>

所以总结如下
1.需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)
2.构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new类从而失去单例模式的意义
3.必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用

PHP单例模式的缺点
众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

3.策略模式

策略的计算加减乘除

interface Math
{
    public function  cal($a,$b);
}
class addMath implements  Math
{
    public function cal($a,$b)
    {
        echo $a+$b;
    }
}
class subMath implements  Math
{
    public function cal($a,$b)
    {
        echo $a-$b;
    }
}
class divMath implements  Math
{
    public function cal($a,$b)
    {
        echo $a/$b;
    }
}
class mulMath implements  Math
{
    public function cal($a,$b)
    {
        echo $a*$b;
    }
}


class  Cmath
{
    protected $cal =null;
    public function __construct($type)
    {
        $caltype = $type.'Math';
        $this->cal = new $caltype;
//      return 
    }
    public function cal($a,$b)
    {
        $this->cal->cal($a,$b);
    }
    
}
$para1 = $_POST['para1'];
$para2 = $_POST['para2'];

$type = $_POST['cal'];
$cmath = new Cmath($type);
$cmath->cal($para1, $para2);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容