PHP设计模式——工厂模式

原文: http://coderschool.cn/1521.html

这一篇也讲得不错!!

http://www.cnblogs.com/wangtao_20/p/3594192.html

http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html

------------------------------------------------------------------------------------------------

PHP工厂模式就是用一个工厂方法来替换掉直接new对象的操作。

在传统习惯中,如果要生成一个类的话,在代码中直接new一个对象,比如:


1

2

3

4

5

class Database{

   

}

$db = new Database();

下面介绍工厂模式的操作方法:


1

2

3

4

5

6

7

8

9

10

11

12

13

class Database{  

}

//创建一个工厂类

class Factory

{

   //创建一个静态方法

   static function createDatabase(){

       $db = new Database;

       return $db;

   }

}

那么,当我们想创建一个数据库类的话,就可以使用这样的方法:


1

$db = Factory::createDatabase();

简单工厂模式比直接new一个对象的好处是,比如Database这个类在很多php文件中都有使用到,当Database这个类发生了某些变更,比如修改了类名、或者一些参数发生了变化,那这时候如果你使用的是$db = new Database这种传统方法生成对象,那么在所有包含这种生成对象的php文件代码中都要进行修改。而使用工厂模式,只要在工厂方法或类里面进行修改即可。而且工厂模式是其他设计模式的基础。

对上面的简单工厂模式再进一步优化,比如:

利用工厂类生产对象


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

class Example

{

    // The parameterized factory method

    public static function factory($type)

    {

        if (include_once ‘Drivers/‘ . $type . ‘.php‘) {

            $classname = ‘Driver_‘ . $type;

            return new $classname;

        } else {

            throw new Exception(‘Driver not found‘);

        }

    }

}

// Load a MySQL Driver

$mysql = Example::factory(‘MySQL‘);

// Load an SQLite Driver

$sqlite = Example::factory(‘SQLite‘);

?>

简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。

要理解工厂模式这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。

该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

看下实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    <?php

    interface IUser

    {

      function getName();

    }

    class User implements IUser

    {       

      public $id;

      public function __construct( $id ) { }

      public function getName()

      {

        return "Jack";

      }

    }

传统方法使用 User 类,一般都是这样:


1

2

3

4

5

6

7

8

9

//在页面1

$obj = new User(1);

//在页面2

$obj2 = new User(2);

//在页面3

$obj3 = new User(3);

....

这时候,由于新的需求,使得User类要新增个参数或者User类名称发生变化,User 类代码发生变动,即:


1

2

3

4

5

6

7

8

9

10

class User implements IUser

{

  public $id,$pre;

  public function __construct( $id , $pre = ‘‘) {...}

  public function getName()

  {

    return $this->pre."Jack";

  }

}

接着,恐怖的事情发生了,假设之前有 100 个页面引用了之前的 User 类,那么这 100 个页面都要发生相应的改动:


1

2

3

4

5

6

7

8

9

//在页面1

$obj = new User(1,‘aaa‘);

//在页面2

$obj = new User(2,‘aaa‘);

//在页面3

$obj = new User(3,‘aaa‘);

...

本来是一个小小的改动,但因紧密耦合的原因使得改动大吐血。而使用工厂模式则可以避免发生这种情况:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//User类为变动前

class UserFactory

{

  public static function Create( $id )

  {

    return new User( $id );

  }

}

//页面1

$uo1 = UserFactory::Create( 1 );

//页面2

$uo12 = UserFactory::Create( 2 );

....

这时候需求变动,User 类也发生变动:


1

2

3

4

5

6

7

8

9

10

class User implements IUser

{

  public $id,$pre;

  public function __construct( $id , $pre = ‘‘) {...}

  public function getName()

  {

    return $this->pre."Jack";

  }

}

但是,我们不再需要去改动这 100 个页面,我们要改的仅仅是这个工厂类:


1

2

3

4

5

6

7

8

//

class UserFactory

{

  public static function Create( $id,$pre = ‘aaa‘ )

  {

    return new User( $id ,$pre);

  }

}

其他100个页面不用做任何改动,这就是工厂设计模式带来的好处。看下UML图:

时间: 2024-10-05 05:05:29

PHP设计模式——工厂模式的相关文章

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

5分钟读书笔记之 - 设计模式 - 工厂模式

一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一种模式,它使用一种方法来决定究竟实例化那个具体的类. 简单工厂模式 假设你想开几个自行车商店,每个商店都有几种型号的自行车出售,可以用这样一个类来表示: var BicycleShop = function(){} BicycleShop.prototype = { sellBicycle:func

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

设计模式-工厂模式

一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品:             这三种模式从上到下逐步抽象,并且更具一般性.             GOF在<

设计模式——工厂模式

常说的工厂模式一般认为有三种:简单工厂.工厂方法模式.抽象工厂模式.其中简单工厂严格上来说不是一种设计模式,而被认为是一种好的编码习惯/风格. 简单工厂 简单工厂的本质就是封装变化的代码,使客户代码将要面临的改变变少.而且被封装的代码也有了更好的复用性,比如服务多个客户端或者被继承/包装等工具来扩展. 下面以肾5和肾6为对象来说明 //define product(iphone) interface public interface IPhone{ public void model(); }

JavaScript设计模式——工厂模式

工厂模式:是一种实现“工厂”概念的面上对象设计模式.实质是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.创建一个对象常常需要复杂的过程,所以不适合在一个复杂的对象中.创建对象可能会导致大量的重复代码,也可能提供不了足够级别的抽象.工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题,由子类实现这个方法来创建具体类型的对象. 1.简单工厂: //定义接口 var Bicycle = new Interface('Bicycle', [