设为首页 收藏本站
查看: 883|回复: 0

[经验分享] 16个PHP设计模式详解

[复制链接]

尚未签到

发表于 2017-12-29 20:43:37 | 显示全部楼层 |阅读模式
  说明:该教程全部截选自实验楼教程【16个PHP设计模式详解】:主要介绍16个常用的设计模式的基础概念和技术要点,通过UML类图帮助理解设计模式中各个类之间的关联关系,针对每种设计模式都使用PHP完成了一个代码示例,让你跟随实例轻松入门设计模式。


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

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


  • Factory类:负责创建具体产品的实例
  • Product类:抽象产品类,定义产品子类的公共接口
  • ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能
  UML类图:

  示例代码:
  

<?php  
//简单工厂模式
  
class Cat
  
{
  function __construct()
  {

  echo "I am Cat>  }
  
}
  
class Dog
  
{
  function __construct()
  {

  echo "I am Dog>  }
  
}
  
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');
  

  简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

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


  • Product:抽象产品类
  • ConcreteProduct:具体产品类
  • Factory:抽象工厂类
  • ConcreteFactory:具体工厂类
  UML类图:

  示例代码:
  

<?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 Dog implements Animal
  
{
  public function run(){
  echo "I'm running fast <br>";
  }
  public function say(){

  echo "I am Dog>  }
  
}

  
abstract>  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();
  

  工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

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


  • 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
  • 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
  角色:


  • 抽象工厂(AbstractFactory):担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。
  • 具体工厂(Factory):这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。
  • 抽象产品(AbstractProduct):担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口
  • 具体产品(Product):抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。
  UML类图:

  示例代码:
  

<?php  

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

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

  public function use()
  {
  echo "I'm watching 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>";
  }
  
}
  


  
abstract>  abstract public static function createPc();
  abstract public static function createTv();
  
}
  

  
class ProductFactory extends Factory
  
{
  public static function createTV()
  {
  return new HaierTv();
  }
  public static function createPc()
  {
  return new LenovoPc();
  }
  
}
  

  
$newTv = ProductFactory::createTV();
  
$newTv->open();
  
$newTv->use();
  

  
$newPc = ProductFactory::createPc();
  
$newPc->work();
  
$newPc->play();
  

  

二、建造者模式
  又名:生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
  建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。例如,一辆汽车由轮子,发动机以及其他零件组成,对于普通人而言,我们使用的只是一辆完整的车,这时,我们需要加入一个构造者,让他帮我们把这些组件按序组装成为一辆完整的车。
  角色:


  • Builder:抽象构造者类,为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder:具体构造者类,实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口
  • Director:指挥者,构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。  
    包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

  UML类图:

  示例代码:
  

<?php  
/**
  
* chouxiang builer
  
*/

  
abstract>  
{
  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();
  

三、单例模式

  单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。


  实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。


  ---维基百科

  单例模式的要点有:某个类只能有一个实例;它必须自行创建本身的实例;它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。
  角色:


  • Singleton:单例类
  UML 类图:

  示例代码:
  

<?php  

  
class Singleton
  
{
  private static $instance;
  //私有构造方法,禁止使用new创建对象
  private function __construct(){}
  

  public static function getInstance(){
  if (!isset(self::$instance)) {
  self::$instance = new self;
  }
  return self::$instance;
  }
  //将克隆方法设为私有,禁止克隆对象
  private function __clone(){}
  

  public function say()
  {
  echo "这是用单例模式创建对象实例 <br>";
  }
  public function operation()
  {
  echo "这里可以添加其他方法和操作 <br>";
  }
  
}
  

  
// $shiyanlou = new Singleton();
  
$shiyanlou = Singleton::getInstance();
  
$shiyanlou->say();
  
$shiyanlou->operation();
  

  
$newShiyanlou = Singleton::getInstance();
  
var_dump($shiyanlou === $newShiyanlou);
  

  上述的五个模式均属于创建型模式,关于结构型模式,点击【16个PHP设计模式详解】即可查看了……

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429498-1-1.html 上篇帖子: PHP中的对象遍历技巧 下篇帖子: PHP实现敏感词过滤系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表