QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3967|回复: 4

[PHP开发] PHP中的设计模式

[复制链接]

294

主题

319

帖子

1045

积分

中级会员

Rank: 3Rank: 3

积分
1045
发表于 2016-1-14 11:25:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
工厂模式
  1. /* 工厂模式代码片段*/
  2. class Employee{

  3.     private static $type = array('minion', 'wellcon', 'student');

  4.     public static function recuit($name)
  5.     {
  6.         $num = rand(1, count(Employee::$type)) - 1 ;
  7.         $class = Employee::$type[$num]; // 访问静态属性要加$符
  8.         return new $class($name);
  9.     }
  10. }
  11. $boss = new Boss();
  12. $boss->addEmployee(Employee::recuit('hard')); // 静态方法生成实例对象,作为addEmployee函数的参数
复制代码
工厂就是负责生成对象的类或方法
  1. class Demo {

  2.     public function getInstance($type)
  3.     {
  4.         switch($type){
  5.             case '1':
  6.                 return new A();
  7.                 break;
  8.             case '2':
  9.                 return new B();
  10.                 break;
  11.             case '3':
  12.                 return new C();
  13.                 break;

  14.         }
  15.     }
  16. }
复制代码
工厂模式,是把创造者类和要生产的类分开,创建者是个工厂类,定义了用于生产产品对象的方法
  1. abstract class commonMessage {

  2.     abstract function getInstance();
  3. }

  4. class A extends commonMessage{

  5.     public function getInstance()
  6.     {
  7.         return new A();
  8.     }
  9. }

  10. class B extends commonMessage{

  11.     public function getInstance()
  12.     {
  13.         return new B();
  14.     }
  15. }
复制代码
行程特殊的代码重复,不必要的子类话,为了工厂模式,而为创建类创建子类

抽象工厂模式
对于那些不必须要的子类模式,合并起来,通过一个类中多个方法就可以完成工厂输出
  1. abstract class messageFactor
  2. {

  3.     abstract function getHeader();

  4.     abstract function getMail();

  5.     abstract function getMobile();

  6.     abstract function getFooter();
  7. }

  8. class smudgeMo extends messageFactor
  9. {

  10.     public function getHeader()
  11.     {
  12.         return 'Header';
  13.     }

  14.     public function getMail()
  15.     {
  16.         return new Mail();
  17.     }

  18.     public function getMobile()
  19.     {
  20.         return new Mobile();
  21.     }

  22.     public function getFooter()
  23.     {
  24.         return 'Footer';
  25.     }
  26. }

  27. class julylovinMo extends messageFactor
  28. {

  29. // 和上个子类相似
  30. }
复制代码
虽然减少了子类继承,但是耦合问题太严重,如果增加一个产品类型, 抽象函数和子类继承体,都需要增加对应的方法
  1. abstract class factory{

  2.     const APPT = 1;
  3.     const TTD = 1;
  4.     const CONTACT = 1;
  5.     abstract function make($flag_int);
  6. }

  7. class mailModel extends factory{

  8.     public function make($flag_int)
  9.     {
  10.         switch ($flag_int){

  11.             case self::APPT:
  12.                 return new apptEncoder();
  13.                 break;

  14.             case self::TTD:
  15.                 return new ttdEncoder();
  16.                 break;

  17.             case self::CONTACT:
  18.                 return new contactEncoder();
  19.                 break;
  20.         }


  21.     }
  22. }
复制代码
紧凑型工厂模式,但是耦合度高,不利于维护

单例模式
全局变量将类捆绑于特定环境中,破坏了封装
特点:
preference 可以被任何对象调用,无需将对象作为参数传递
preference 不该保存在全局变量中
系统中不应超过一个preference对象,即只允许实例化一次
  1. class Preference
  2.     {

  3.     static $instance;
  4.     public $name;

  5.     private function __construct()
  6.     {

  7.     }

  8.     public function setName($name)
  9.     {
  10.         $this->name = $name;
  11.     }

  12.     public function getName()
  13.     {
  14.         return $this->name;
  15.     }

  16.     public static function getInstance()
  17.     {
  18.         if (empty(self::$instance)) // 控制了只有一个Preference实例对象
  19.         {
  20.             self::$instance = new Preference();
  21.         }
  22.         return self::$instance;
  23.     }
  24. }
复制代码
原型模式
用组合代替继承,抽象工厂模式有平行层次继承,会有耦合问题
使用clone关键词复制已经存在的产品, 具体产品本身,便成为自身生成的基础
  1. class sea {
  2. private $navigability = 0 ; //可航行
  3. public function __construct($navigability)
  4.     {
  5.         $this->navigability = $navigability;
  6.     }
  7. }
  8. class earthsea extends sea{}
  9. class plain{}
  10. class earthplain extends plain{}
  11. class forest{}
  12. class earthforest extends forest{}
  13. class factory{

  14.     private $sea;
  15.     private $plain;
  16.     private $forest;

  17.     public function __construct(sea $sea, plain $plain, forest $forest)
  18.     {
  19.         $this->sea = $sea;
  20.         $this->plain = $plain;
  21.         $this->forest = $forest;
  22.     }

  23.     public function getSea()
  24.     {
  25.         return clone $this->sea;// 只是引用对象,是同一个对象,并非两个对象
  26.     }

  27.     public function getPlain()
  28.     {
  29.         return clone $this->plain;
  30.     }

  31.     public function getForest()
  32.     {
  33.         return clone $this->forest;
  34.     }
  35. }

  36. $earthInstance = new factory(new earthsea(1), new earthplain(), new earthforest()); //海域可航行
  37. $earthInstance->getForest(); // new earthforest() 的实例
复制代码
组合模式
组合模式有助于集合和组件之间关系建立模型
枪手(Archer)组合成军队(Arm),多个枪手可以增加军队的战斗力(bombardStrength)
  1. abstract class unit {

  2.     public function addunit(Unit $unit){
  3.         // 阻止独立单元再次添加对象
  4.         throw new unitException(get_class($unit).'is a leaf');
  5.     }

  6.     public function removeunit(Unit $unit){
  7.         // 阻止独立单元删除添加对象
  8.         throw new unitException(get_class($unit).'is a leaf');
  9.     }
  10.     abstract function bombardStrength();
  11. }

  12. class unitException extends Exception{}

  13. class Archer extends unit {

  14.     public function bombardStrength()
  15.     {
  16.         return 4 ;
  17.     }
  18. }

  19. class Army extends unit{  //组合模式体

  20.     private $units = array();

  21.     public function addunit(Unit $unit)
  22.     {
  23.         if(in_array($unit, $this->units, true))
  24.         {
  25.             return ;
  26.         }
  27.         $this->units[] = $unit;
  28.     }

  29.     public function removeunit(Unit $unit)
  30.     {
  31.         $units = array();
  32.         foreach ($this->units as $item)
  33.         {
  34.             if($item !== $unit)
  35.             {
  36.                 $units[] = $item;
  37.             }
  38.         }
  39.         $this->units = $units;
  40.     }

  41.     public function bombardStrength()
  42.     {
  43.         $ret = 0 ;
  44.         foreach ($this->units as $unit)
  45.         {
  46.             $ret += $unit->bombardStrength();
  47.         }
  48.         return $ret;
  49.     }
  50. }

  51. $SubArmy = new Army();
  52. $SubArmy->addunit( new Archer());
  53. $SubArmy->addunit( new Archer());
  54. echo $SubArmy->bombardStrength(); // 8
复制代码


642

主题

798

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10863
发表于 2016-1-14 11:49:38 | 显示全部楼层
涨知识了,常用的是MVC设计模式吧。
招募核心会员担任PHP-Z版主和管理员,共同管理论坛和群组,有意者在论坛发消息联系我

4

主题

77

帖子

2896

积分

中级会员

Rank: 3Rank: 3

积分
2896

灌水之王活跃会员

发表于 2016-1-15 22:04:20 | 显示全部楼层
当程序员也几年了,了解了前端,了解了另一种语言,了解了优化,设计模式就慢慢淡忘了

2

主题

16

帖子

232

积分

新手上路

Rank: 1

积分
232
发表于 2016-2-15 16:27:07 | 显示全部楼层

4

主题

77

帖子

2896

积分

中级会员

Rank: 3Rank: 3

积分
2896

灌水之王活跃会员

发表于 2016-2-16 12:57:15 | 显示全部楼层
这些模式到底谁能弄得明白
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

     
    战略合作|联系方式|广告赞助|商务合作|手机版|小黑屋|( 京ICP备14036609号-6 )

GMT+8, 2017-12-15 19:54

© 2013-2017 Powered by Discuz! X3.3. 本站由 又拍云 提供 CDN 图片存储服务

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