工厂模式

提到的最多, 用途也最广. 简单说就是: 定义一个用户创建对象的接口. 把创建对象的过程封装起来.

工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级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设计模式浅析的更多相关文章

  1. 程序设计模式浅析(plain framework商业版设计模式)

    程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...

  2. IOS设计模式浅析之简单工厂模式(SimpleFactory)

    概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...

  3. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  4. python设计模式浅析

    今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...

  5. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  6. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  7. IOS设计模式浅析之建造者模式(Builder)

    定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...

  8. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  9. IOS设计模式浅析之适配器模式(Adapter)

    引言 在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的.怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境, ...

  10. IOS设计模式浅析之桥接模式(Bridge)

    引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...

随机推荐

  1. 对C#调用C++ dll文件进行总结

    在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一 ...

  2. 十天学会零基础入门学习Photoshop课程(在线观看)

    适合人群:在校学生 在职工作者 淘宝运营者等一系列会操作电脑的人群 课程目录 试学课 课时11前言 8分钟1秒 课时22工作界面 试学课 课时33文件的新建 试学课 课时44文档保存 11分钟24秒  ...

  3. php parallel

    http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/ http://stackoverflow.com/question ...

  4. c# 两个数组比较,将重复部分去掉,返回不重复部分

    List<string> Ashuzu = new List<string>(); Ashuzu.Add("); Ashuzu.Add("); List&l ...

  5. asp.net 后台 修改 javascript 变量

    Util.JSSetChange(Page, GetType()); public static void JSSetChange(Page page, Type cstype) { // Defin ...

  6. 009.EscapeRegExChars

    类型:function 可见性:public 所在单元:RegularExpressionsCore 父类:TPerlRegEx 把转义字符变成原意字符 例如\d意为0~9某个数字,通过此函数转换后则 ...

  7. Python 基础篇:介绍

    1. Python 发展 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Cir ...

  8. asp.net项目中通过Web.config配置文件及文件夹的访问权限---forms

    十分全面的forms验证配置: http://blog.csdn.net/qingyun1029/article/details/6184723

  9. Android中的时间日期选择器

    1.layout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  10. 十五、mysql 分区之 分区管理

    1.mysql分区处理分区字段NULL值的方式 1.range分区null被当作最小值处理 2.list分区null值必须被枚举出来,否则将出错 3.hash/key分区 null值当作0处理 2.R ...