工厂模式

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

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

    nmon 下载:http://pan.baidu.com/s/1jICoSpo 放到linux下可以直接运行. nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新. n ...

  2. 09_Java8操作集合的一些新特性

    [使用forEach()结合Lambda表达式遍历集合] public class ForEachDemo { public static void main(String[] args) { Col ...

  3. MySQL的 inner join on 与 left join on

    WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接.INNER JOIN……ON子句产生的连接称为显性连接. inner join:理解为“有效连接”,两张表中都有的数据才会显示left ...

  4. [DevExpress]设置RepositoryItemComboBox只可下拉选择不可编辑

    将TextEditStyle属性设置如下即可: 希望有所帮助!

  5. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

  6. [ Database ] [ Sybase ] [ SQLServer ] sybase 與SQL Server的界接方式

    目前我們有個專案Server A安裝了 SQL Server 2012,有個需求需要連線到另外一台Server B上的 Sybase 12.5的view, 先前試過了很多方法都無法連通.主要的原因是因 ...

  7. cron以及在laravel中使用cron

    yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...

  8. 【CSDN人物访谈】蒋守壮分享他的技术成长之路以及对Hive技术的解读与思考

    结缘大数据技术 CSDN:请简单地介绍一下自己. 蒋守壮:首先非常感谢CSDN能够给我这次被专访的机会,可以让我重新审视自己的职业发展历程,也希望能够帮助一些同行的朋友们.目前就职万达网络科技集团有限 ...

  9. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  10. 在iframe结构中,如何使弹出层位于所有框架的上方(-)

    在做后台管理页面的时候,经常用到iframe.虽说这东西有些过时,也不利于SEO,但是后台就是后台,不需要考虑那么多东西,综合来说,用iframe还是很适合后台管理界面的. 但是在遇到弹出层时,出现了 ...