注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

记录~~~

Stay Hungry. Stay Foolish.

 
 
 

日志

 
 

再一次读 工厂模式  

2013-05-27 22:11:39|  分类: 读书笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
由于缺乏实践经验,对设计模式的理解总是浑浑噩噩。

********
工厂模式定义:实例化对象,用工厂方法代替new操作.

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是你要生成的对象对应的类名称。 
********
************************
工厂方法模式:解决了当代码关注于抽象类型时如何创建对象实例的问题。
答案:用特定的类来处理实例化。

实现:工厂方法模式把创建者类与要生产的产品类分离开来。创建者是一个工厂类,其中定义了用于生成产品对象的类方法。如果没有提供默认实现,那么就由创建者类的子类来执行实例化。
一般情况下,就是创建者类的每个子类实例化一个相应产品子类。

<?php
/*
* 抽象产品类
*/
abstract class ApptEncoder{
abstract function encode();
}

class BloggsApptEncoder extends ApptEncoder{

function encode(){
return "Apponitment data encode in BloggsCal format\n<br>";
}
}

abstract class CommsManager {

abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getFooterText();
}

class BloggsCommsManager extends CommsManager {
function getHeaderText(){
return "BloggsCal header\n <br>";
}

function getApptEncoder(){
return new BloggsApptEncoder();
}

function getFooterText(){
return "BloggsCal footer\n<br>";
}
}

$fac = new BloggsCommsManager();
//客户端代码直接调用 生成的对象直接调用 产品抽象类的encode()方法,不需要知道具体的产品
$pro = $fac->getApptEncoder();
echo $fac -> getHeaderText();
echo $pro -> encode();
echo $fac -> getFooterText();


该模式会导致不必要的子类化。
************************

抽象工厂模式: 
需要工厂生产一组相关的类。

预约(Appt)、代办事宜(Ttd)、联系人(Contact).

BloggsCommsManager:具体的创建者类
ApptEncoder、TtdEncoder、ContactEncoder 3个将被创建的产品类

<?php
/**
* 抽象工厂模式
* @author GaoZhen'an <gaoce227@hotmail.com>
* @version $Id: 02.php $
*/
abstract class CommsManager {
abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getTtdEncoder();
abstract function getContactEncoder();
abstract function getFooterText();
}

class BloggsCommsManager extends CommsManager {

function getHeaderText(){
return "BloggsCal header <br>";
}

function getApptEncoder() {
return new BloggsApptEncoder();
}

function getTtdEncoder() {
return new BloggsTtdEncoder();
}

function getContactEncoder() {
return new BloggsContactEncoder();
}

function getFooterText() {
return "BloggsCal footer <br>";
}
}



  评论这张
 
阅读(144)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018