五. PHP模式设计----生成对象
来源:互联网 发布:真实的魔法书淘宝 编辑:程序博客网 时间:2024/06/06 13:29
1 对象生成问题 下面代码,主类在自己的内部生成了聚合的对象(四. 设计原则 中也是这么做),这样会限制到了代码的灵活性//雇员抽象类abstract class Employee{ protected $name; function __construct($name){ $this->name=$name; } abstract function fire();}class Minion extends Employee{ function fire(){ print "{$this->name}:I'll clear my desk"; }}//阴险的老板class NastyBoss{ private $employee=array(); function addEmployee($employeeName){ //生成Minion雇员对象 $this->employee[]=new Minion($employeeName); } //解雇一名员工 function projectFails(){ if(count($this->employee)>0){ $employee=array_pop($this->employee); $employee->fire(); } }}$boss=new NastyBoss();$boss->addEmployee("Bob");$boss->projectFails();2 使用单例模式创建对象class Preferences{ private $propos=array(); private static $instance; //静态私有构造方法 private function __construct(){} public static function getInstance(){ if(empty(self::$instance)){ self::$instance=new Preferences(); } return self::$instance; } public function setProperty($key,$val){ $this->propos[$key]=$val; } public function getProperty($key){ return $this->propos[$key]; } }$pref=Preferences::getInstance();$pref->setProperty("Bob", 55);//删除引用unset($pref);$pref=Preferences::getInstance();print $pref->getProperty("Bob");//print=>552 工厂方法模式//工厂方法模式//把创建者和产品类分离开//*管理抽象类(创建者creator)abstract class CommsManager{ abstract function getHeaderText(); abstract function getApptEncoder(); abstract function getFooterText();}class BloggsCommsManager extends CommsManager{ function getHeaderText(){ return "Bloggs HeaderText!"; } function getApptEncoder(){ return new BloggsApptEncoder(); } function getFooterText(){ return "Bloggs FooterText!"; }}class MegaCommsManager extends CommsManager{ function getHeaderText(){ return "Bloggs HeaderText!"; } function getApptEncoder(){ return new MegaApptEncoder(); } function getFooterText(){ return "Bloggs FooterText!"; }}//*产品抽象类(产品product)abstract class ApptEncoder{ abstract function encode();}//BloggsCal格式的编码器class BloggsApptEncoder extends ApptEncoder{ function encode(){ return "Appointment data encode in BloggsCal format\n"; }}//MegaCal格式的编码器class MegaApptEncoder extends ApptEncoder{ function encode(){ return "Appointment data encode in MegaCal format\n"; }}3 抽象工厂模式 一般来说,抽象工厂模式跟工厂模式是一样的(JAVA,C++),但是在PHP是不同的,由于PHP没有强制要求方法的返回值,所以可以在工厂模式的基础上只定义一个BloggsCommsManager类用来管理全部Bloggs格式的产品(比如产品除了上面的BloggsApptEncoder外,还有BloggsTtdEncoder(办公事宜),BloggsContactEncoder(联系人),此时只需要一个make(Flag),根据flag不同,返回出不同的产品出来4 原型模式//原型模式//与工厂模式比较,好处就是不用每次定义一个新的产品都需要去改动管理类.//直接让新产品自己具备生成自己的功能//*海(产品类)abstract class Sea{}class EarthSea extends Sea{};class MarsSea extends Sea{};abstract class Plains{}class EarthPlains extends Plains{}class MarsPlains extends Plains{}abstract class Forest{}class EarthForest extends Forest{}class MarsForest extends Forest{} //*地形工厂类(管理类)//省去了用于创建各种产品的子类,直接在一开始的时候初始化好产品类,//之后让产品类自己克隆出自己(注意有时候需要进行必要的深度拷贝:产品类中包含其他对象的引用时)class TerrainFactory{ private $sea; private $plains; private $forest; function __construct(Sea $sea,Plains $plains,Forest $forest){ $this->sea=$sea; $this->plains=$plains; $this->forest=$forest; } //利用工厂类生成产品本身 function getSea(){ return clone $this->sea; } function getPlains(){ return clone $this->plains; } function getForest(){ return clone $this->forest; }}//自由组合所需要的类型$factory=new TerrainFactory(new EarthSea(), new MarsPlains(), new EarthForest());print_r($factory);
0 0
- 五. PHP模式设计----生成对象
- PHP生成对象之设计模式—单例模式
- PHP生成对象之设计模式—工厂方法模式
- PHP五种设计模式
- PHP生成对象的模式
- PHP面向对象学习笔记之二:生成对象的设计模式
- php面向对象设计模式
- PHP面向对象设计模式
- 五种常见的 PHP 设计模式
- 五种常见的PHP设计模式
- 五种常见的PHP设计模式
- 五种常见的PHP设计模式
- 五种常见的 PHP 设计模式
- 五种常见的 PHP 设计模式
- 五种常见的 PHP 设计模式
- 五种常见的PHP设计模式
- 五种常见的 PHP 设计模式
- 五种常见的 PHP 设计模式
- Mac本换ssd注意事项
- Cisco路由器交换机密码恢复
- windows下oracle每天定时备份
- Android ListView在切换分类的时候发生错误.数组越界
- 【C/C++学习】error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
- 五. PHP模式设计----生成对象
- pcm文件格式
- Sqlite数据库sqlite3命令
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
- HTML转PDF(C#---itextsharp)
- Erlang cowboy http request生命周期
- javascript入门经典---笔记6 (打开新窗口)
- 在.net中使用JSON
- hdu 1800 Flying to the Mars(字典树)