PHP面向对象学习笔记之二 生成对象的设计模式


Posted in PHP onOctober 06, 2012

一. 单例模式(Singleton)
如果应用程序每次包含且仅包含一个对象,那么这个对象就是一单例. 用来替代全局变量.

<?php 
require_once("DB.php"); 
class DatabaseConnection{ 
<STRONG><SPAN style="COLOR: #ff0000">public static function get()</SPAN></STRONG>{ 
static $db = null; 
if ( $db == null ) 
$db = new DatabaseConnection(); 
return $db; 
} 
private $_handle = null; 
<STRONG><SPAN style="COLOR: #ff0000">private function __construct()</SPAN></STRONG> { 
$dsn = 'mysql://root:password@localhost/photos'; 
$this->_handle =& DB::Connect( $dsn, array() ); 
} 
public function handle() 
{ 
return $this->_handle; 
} 
} 
print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); 
print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); 
?>

二.工厂方法模式(factory method)要解决的问题:

1>在代码运行时候才知道要生成的对象类型; 2>对象类型可能要扩充新产品类型; 3>每个产品类型都可以定制特定的功能;工厂方法模式把创建者类与要生产的产品类分离.创建者是一个工厂类,其中定义了用于生成产品对象的类方法.如果没有提供默认实现,就由创建者类的子类来执行实例化.一般情况下,就是每个创建者类的子类实例化一个相应的产品子类.工厂模式的优点就在创建对象上。 它的任务就是把对象的创建过程都封装起来,然后返回一个所需要的新类。想改变对象的结构和建立对象的方式,只需选择对象工厂,对代码的改变只需要一次就够了。( 工厂模式的功能是如此强大, 它处于是应用的底层, 所以在许多其余的复杂模式和应用中它会不停地出现。)不同处理对象,内部自动分流处理,但对用户来说,只有一个方法,简单方便 使用接口方式实践工厂模式的例子:

interface Hello{ 
function say_hello(); 
} 
class English implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
class Chinese implements Hello{ 
public function say_hello(){ 
echo "你好"; 
} 
} 
class speak{ 
public static function factory($type){ 
if($type == 1) $temp = new English(); 
else if($type == 2) $temp = new Chinese(); 
else{ 
die("Not supported!"); 
} 
return $temp; 
} 
} 
$test = Speak::factory(1); 
$test->say_hello();

在<深入浅出设计模式>中,上面的被称为简单工厂模式,因为这个工厂必须能分辨要生产的全部产品.如果有新的产品,必须对工厂进行对应修改,增加相应的业务逻辑或判断.简单工厂模式的一个标志就是静态方法实现工厂生产功能.(不简单的)工厂方法模式: 工厂方法是抽象类或接口,具体工厂实现这个方法(接口),让使用者调用以创建具体产品对象(每一个产品都有对应的具体工厂)下面是重写的hello
//抽象工厂 
interface Speaker{ 
function assignSpeaker(); 
} 
//具体工厂1 
class EnglishSpeaker implements Speaker{ 
public function assignSpeaker(){ 
return new English(); 
} 
} 
//具体工厂2 
class ChineseSpeaker implements Speaker{ 
public function assignSpeaker(){ 
return new Chinese(); 
} 
} 
//抽象产品 
interface Hello{ 
function say_hello(); 
} 
//具体产品1 
class English implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
//具体产品2 
class Chinese implements Hello{ 
public function say_hello(){ 
echo "你好"; 
} 
}

使用:
if(!empty($_GET['t'])){ 
switch($_GET['t']){ 
case 1: $temp=new EnglishSpeaker(); 
break; 
case 2: $temp=new ChineseSpeaker(); 
break; 
} 
$man=$temp->assignSpeaker(); 
$man->say_hello(); 
}

三.抽象工厂模式(Abstract Factory)产品族;每个实体工厂负责一个产品族(1,2...)的产品, 而每个产品族又划分出几个不同类别(A,B...)单从某一个实体工厂看,其实就是一个工厂方法模式
PHP面向对象学习笔记之二 生成对象的设计模式
如果上面的hello例子,又多出来表达方式,正常和歌唱式表达(2个产品族)
//抽象工厂 
abstract class Speaker{ 
const NORMAL =1; 
const SING =2; 
abstract function assignSpeaker($flag_int); 
} 
//具体工厂1 
class EnglishSpeaker extends Speaker { 
public function assignSpeaker($flag_int){ 
switch($flag_int){ 
case self::NORMAL: 
return new NormalEnglish(); 
break; 
case self::SING: 
return new SingEnglish(); 
break; 
} 
} 
} 
//具体工厂2 
class ChineseSpeaker extends Speaker{ 
public function assignSpeaker($flag_int){ 
switch($flag_int){ 
case self::NORMAL: 
return new NormalChinese(); 
break; 
case self::SING: 
return new SingChinese(); 
break; 
} 
} 
} 
//抽象产品 
interface Hello{ 
function say_hello(); 
} 
//具体产品A1 
class NormalEnglish implements Hello{ 
public function say_hello(){ 
echo "Hello!"; 
} 
} 
//具体产品B1 
class NormalChinese implements Hello{ 
public function say_hello(){ 
echo "你好!"; 
} 
} 
//具体产品A2 
class SingEnglish implements Hello{ 
public function say_hello(){ 
echo "Oh, jingle bells, jingle bells, Hello! Hello! Hello!"; 
} 
} 
//具体产品B2 
class SingChinese implements Hello{ 
public function say_hello(){ 
echo "叮叮当,叮叮当, 你好!你好!你好!"; 
} 
}

使用:
//根据程序的业务逻辑确定具体工厂 
switch($_GET['language']){ 
case 1: $temp=new EnglishSpeaker(); 
break; 
case 2: $temp=new ChineseSpeaker(); 
break; 
} 
//根据程序的业务逻辑确定具体产品,无需关心是哪个具体工厂了,维护性提高 
$man=$temp->assignSpeaker( $_GET['style']); 
//使用产品,无需关心是哪个具体产品 
$man->say_hello();

四.原型模式(Prototype)
使用clone 来复制已存在的具体产品,然后具体产品类本身就成为他们自己生成的基础.
PHP 相关文章推荐
教你如何把一篇文章按要求分段
Oct 09 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
php中explode与split的区别介绍
Oct 03 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
php实现的操作excel类详解
Jan 15 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 #PHP
php生成局部唯一识别码LUID的代码
Oct 06 #PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 #PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 #PHP
PHP中的生成XML文件的4种方法分享
Oct 06 #PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 #PHP
PHP正则表达式之定界符和原子介绍
Oct 05 #PHP
You might like
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python 正则式使用心得
2009/05/07 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
python 读写中文json的实例详解
2017/10/29 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
捷科时代的软件测试笔试题
2015/11/09 面试题
J2EE面试题大全
2016/08/06 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
自荐信范文
2019/05/20 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL