PHP设计模式浅析
工厂模式
提到的最多, 用途也最广. 简单说就是: 定义一个用户创建对象的接口. 把创建对象的过程封装起来.
工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级PHP开发人员是很重要的。
工厂模式通常用来返回符合类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应实例化哪一个类,例如,可以使用这样的提供者来扩展一个类,而不需要重构应用程序的其他部分,从而使用新的扩展后的名称 。
通常,工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,工厂方法可以任意命名,这个静态还可以接受任意数据的参数,必须返回一个对象。
【抽象工厂模式中主要角色】
抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。
具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。
抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。
简单工厂模式:
①抽象基类:类中定义抽象一些方法,用以在子类中实现
②继承自抽象基类的子类:实现基类中的抽象方法
③工厂类:用以实例化对象
只要是可以根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想。
class MyObject{
//对象将从工厂返回
} class MyFactory{
public static function factory(){
return new MyObject():
}
} $instance=MyFactory::factory();
//这样子做很方便扩展。我们在直接链接数据库的时候,不是使用代码new Mysql($host,$username,$password,$dbname)的形式 //而可以动态生成一个连接数据库的实例。可以是mysql,也可以是连接oracle的。
interface db {
function connect();
}
interface Factory {
function createDb();
}
class mysqldb implements db {
public function connect() {
echo '连上了mysql';
}
}
class sqlite implements db {
public function connect() {
echo '连上了sqllist';
}
}
class createMysql implements Factory {
public function createDb(){
return new mysqldb();
}
}
class creareLite implements Factory {
public function createDb(){
return new sqlite();
}
} $fact = new createMysql();
var_dump($fact->createDb()->connect());
interface IImage{
function getHeight();
function getwidth();
function getData();
} class Image_PNG implements IImage {
private $_width, $_height, $_data;
public function __construct($file) {
$this->_file=$file;
$this->_parse();
}
private function _parse() {
//finish PNG job
}
public function getWidth() {
return $this->_width;
}
public function getHeight() {
return $this->_height;
}
public function getData() {
return $this->_data;
}
} class Image_JPEG implements IImage{
private $_width, $_height, $_data;
public function __construct($file){
$this->_file = $file;
$this->_parse();
}
private function _parse() {
//finish jpeg job
}
public function getWidth() {
return $this->_width;
}
public function getHeight(){
return $this->_height;
}
public function getData() {
return $this->_data;
}
} class ImageFactory{
public static function factory($file) {
$pathParts = pathinfo($file);
switch (strtolower($pathParts['extension'])) {
case 'jpg':
$ret=new Image_JPEG($file);
break;
case 'png':
$ret=new Image_PNG($file);
break;
}
}
if($ret instanceof IImage){
return $ret;
}else{
//...
}
}
//当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象。
$image = ImageFactory::factory('/path/to/my.jpg');
echo $image->getWidth();
具体应用:
比如一个cms, 你不知道客户用的是什么数据库, 可能mysql, sqlserver, pdo. 每切换一次, 就意味着要生成所选择的数据库的链接对象.
希望的效果是, 传一个mysql, 就可以使用mysql的对象, 传一个pdo, 就可以使用pdo的对象.
$db_object=db_factory::get_instance('pdo');//这里你想换哪个数据库,就填哪个,例如mysql,mysqli,pdo
解决办法:
工厂模式.
对应关系如下:
数据库工厂===>db_factory类
各个数据库链接对象===>在db_factory中生产出来的对象, 而不是生产db_factory类的对象
<?php /**************db_factory.class.php****************/ class db_factory{ static private $instance=null; private function __construct(){
} static public function get_instance($db_type='mysql'){ if(self::$instance==null){ self::$instance=new self(); } $db_factory=self::$instance; return $db_factory->getDbObject($db_type); } protected function getDbObject($db_type){ switch($db_type){ case 'mysql': $obj=getMysql::get_instance(); break; case 'mysqli': $obj=getMysqli::get_instance(); break; case 'pdo': $obj=getPdo::get_instance(); break; default : $obj=getMysql::get_instance(); } return $obj; } } /**************getMysql.class.php****************/ class getMysql{ static private $instance=null; private function __construct(){ } static public function get_instance(){ if(self::$instance==null){ self::$instance=new self(); } return self::$instance; } function select(){ echo 'mysql获取数据'; } } /**************getMysqli.class.php****************/ class getMysqli{ static private $instance=null; private function __construct(){ } static public function get_instance(){ if(self::$instance==null){ self::$instance=new self(); } return self::$instance; } function select(){ echo 'mysqli获取数据'; } } /**************getPdo.class.php****************/ class getPdo{ static private $instance=null; private function __construct(){ } static public function get_instance(){ if(self::$instance==null){ self::$instance=new self(); } return self::$instance; } function select(){ echo 'pdo获取数据'; } } /**************客户端调用****************/ $db_object=db_factory::get_instance('pdo');//这里你想换哪个数据库,就填哪个,例如mysql,mysqli,pdo $db_object->select(); ?>
在需要对象的切换时候可以选择这种模式, 但是对象的切换最好不要超过10, 多了后这种方式的弊端就会显现, 显得累赘了.
这个也不错
http://blog.csdn.net/hguisu/article/details/7505909
单例模式
优点:
1. 在内存中只有一个实例, 减少内存开支, 尤其是一个对象需要频繁创建, 销毁的时候. 而且创建销毁的过程又无法优化, 单例模式的优势就非常明显.
2. 由于单例模式只产生一个对象, 所以减少了对系统性能的开销, 当一个对象的产生需要比较多的资源时, 如读取配置或产生其他依赖对象时, 然后用永久驻留内存的方式来解决.
3. 单例模式避免对资源的多重占用, 例如一个写文件的动作, 由于只有一个实例存在于内存中, 可以避免对同一资源文件的的同时写操作.
4. 单例模式可以在系统设置全局的访问点, 优化和共享资源访问, 例如设计一个单例类, 负责数据所有表的映射处理.
参考自:http://lobert.iteye.com/blog/2033957
PHP设计模式浅析的更多相关文章
- 程序设计模式浅析(plain framework商业版设计模式)
程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...
- IOS设计模式浅析之简单工厂模式(SimpleFactory)
概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
- python设计模式浅析
今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...
- IOS设计模式浅析之单例模式(Singleton)
说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...
- IOS设计模式浅析之原型模式(Prototype)
原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...
- IOS设计模式浅析之建造者模式(Builder)
定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- IOS设计模式浅析之适配器模式(Adapter)
引言 在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的.怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境, ...
- IOS设计模式浅析之桥接模式(Bridge)
引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...
随机推荐
- 119. Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- Hibernate Cascade & Inverse
Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...
- angularJs--$apply和$watch,$digest方法的意思
这个视图对应的控制器是 这样的话,这个date变量,是不会发生改变的,没有触发脏检查,所以这时候要$apply方法,所有自定义的方法都要用$apply来触发脏检查 这样那个日期就会变化了 $diges ...
- foxtable使用笔记
1.设置关联表窗口的列的顺序:Tables("award.people").SetColVisibleWidth("name|100|sex|100|job|100|ag ...
- Python: tkinter实例改名小工具
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...
- 《WPF程序设计指南》读书笔记——第6章 Dock与Grid
1.DockPanel面板 using System; using System.Windows; using System.Windows.Controls; using System.Window ...
- Matlab生成动态链接库供C#调用
1.首先在Matlab中编写一个或几个.m文件 2.然后在命令空间中输入命令:deploytool 3.修改工程名称,修改需要生成文件后缀 4.添加类,添加文件,然后点击生成.
- ^M的前世今生
^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13. 回想计算机发展,旧的打字机使用两个字符来开始一个新行.首先是一个字符命令使打印头移回开始位置(回车),然 ...
- centos修改ssh端口
1.编辑防火墙配置:vi /etc/sysconfig/iptables防火墙增加新端口2222-A INPUT -m state --state NEW -m tcp -p tcp --dport ...
- VB语言基础
一.常用的关键字 Dim Private Sub Public End If Else Form Me Single As Integer Unload Do While MessageBox等 二 ...