工厂模式:

由工厂类根据参数来决定创建出哪一种产品类的实例;

工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。

简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;

代码实现

示例1(最基本的工厂类):

  class MyObject {

 public function __construct(){}

 public function test(){

 return '测试';

 }

 }

 class MyFactory {

 public static function factory(){

 //返回对象的实例

 return new MyObject();

 }

 }

 //调用工厂类MyFactory中的静态方法,获取类MyObject的实例

 $myobject=MyFactory::factory();

 echo $myobject->test();

示例2

  //简单工厂模式

 /1*

  * 定义运算类

  */

 abstract class Operation {

 protected $_NumberA = 0;

 protected $_NumberB = 0;

 protected $_Result  = 0;

 public function __construct($A,$B){

 $this->_NumberA = $A;

 $this->_NumberB = $B;

 }

 public function setNumber($A,$B){

 $this->_NumberA = $A;

 $this->_NumberB = $B;

 }

 /1*

 protected function clearResult(){

 $this->_Result  = 0;

 }

 */

 public function clearResult(){

 $this->_Result  = 0;

 }

 //抽象方法无方法体

 abstract protected function getResult();

 }

 //继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;

 //另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)

 class OperationAdd extends Operation {

 public function getResult(){

 $this->_Result=$this->_NumberA + $this->_NumberB;

 return $this->_Result;

 }

 }

 class OperationSub extends Operation {

 public function getResult(){

 $this->_Result=$this->_NumberA - $this->_NumberB;

 return $this->_Result;

 }

 }

 class OperationMul extends Operation {

 public function getResult(){

 $this->_Result=$this->_NumberA * $this->_NumberB;

 return $this->_Result;

 }

 }

 class OperationDiv extends Operation {

 public function getResult(){

 $this->_Result=$this->_NumberA / $this->_NumberB;

 return $this->_Result;

 }

 }

 class OperationFactory {

 //创建保存实例的静态成员变量

 private static $obj;

 //创建访问实例的公共的静态方法

 public static function CreateOperation($type,$A,$B){

 switch($type){

 case '+':

 self::$obj = new OperationAdd($A,$B);

 break;

 case '-':

 self::$obj = new OperationSub($A,$B);

 break;

 case '*':

 self::$obj = new OperationMul($A,$B);

 break;

 case '/':

 self::$obj = new OperationDiv($A,$B);

 break;

 }

 return self::$obj;

 }

 }

 //$obj = OperationFactory::CreateOperation('+');

 //$obj->setNumber(4,4);

 $obj = OperationFactory::CreateOperation('*',5,6);

 echo $obj->getResult();

 /1*

 echo '<br>';

 $obj->clearResult();

 echo '<br>';

 echo $obj->_Result;

 */

示例3:

  //抽象工厂

 //青铜会员的打折商品

 class BronzeRebateCommodity {

 //描述

 public $desc = '青铜会员的打折商品';

 }

 //白银会员的打折商品

 class SilverRebateCommodity {

 public $desc = '白银会员的打折商品';

 }

 //青铜会员的推荐商品

 class BronzeCommendatoryCommodity {

 public $desc = '青铜会员的推荐商品';

 }

 //白银会员的推荐商品

 class SilverCommendatoryCommodity {

 public $desc = '白银会员的推荐商品';

 }

 //各个工厂的接口

 interface ConcreteFactory {

 //生产对象的方法

 public function create($what);

 }

 //青铜工厂

 class BronzeFactory implements ConcreteFactory {

 //生产对象的方法

 public function create($what){

 $productName = 'Bronze'.$what.'Commodity';

 return new $productName;

 }

 }

 //白银工厂

 class SilverFactory implements ConcreteFactory {

 //生产对象的方法

 public function create($what){

 $productName = 'Silver'.$what.'Commodity';

 return new $productName;

 }

 }

 //调度中心

 class CenterFactory {

 //获取工厂的方法

 public function getFactory($what){

 $factoryName = $what.'Factory';

 return new $factoryName;

 }

 //获取工厂的静态方法

 public static function getFactory2($what){

 $factoryName = $what.'Factory';

 return new $factoryName;

 }

 }

 //实例化调度中心

 $center  = new CenterFactory();

 //获得一个白银工厂

 $factory = $center->getFactory('Silver');

 //让白银工厂制造一个推荐商品

 $product = $factory->create('Commendatory');

 //得到白银会员的推荐商品

 echo $product->desc.'<br>';

 //获得一个青铜工厂

 $factory2 = CenterFactory::getFactory2('Bronze');

 //让青铜工厂制造一个打折商品

 $product2 = $factory2->create('Rebate');

 //得到青铜会员的推荐商品

 echo $product2->desc;

示例4

  //使用工厂类解析图像文件

 interface IImage {

 function getWidth();

 function getHeight();

 function getData();

 }

 class Image_PNG implements IImage {

 protected $_width,$_height,$_data;

 public function __construct($file){

 $this->_file = $file;

 $this->_parse();

 }

 private function _parse(){

 //完成PNG格式的解析工作

 //并填充$_width,$_height和$_data

 $this->_data   = getimagesize($this->_file);

 list($this->_width,$this->_height)=$this->_data;

 }

 public function getWidth(){

 return $this->_width;

 }

 public function getHeight(){

 return $this->_height;

 }

 public function getData(){

 return $this->_data;

 }

 }

 class Image_JPEG implements IImage {

 protected $_width,$_height,$_data;

 public function __construct($file){

 $this->_file = $file;

 $this->_parse();

 }

 private function _parse(){

 //完成JPEG格式的解析工作

 //并填充$_width,$_height和$_data

 //$this->_width  = imagesx($this->_file);

 //$this->_height = imagesy($this->_file);

 $this->_data   = getimagesize($this->_file);

 list($this->_width,$this->_height)=$this->_data;

 }

 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){

 $filename = pathinfo($file);

 switch(strtolower($filename['extension'])){

 case 'jpg':

 $return = new Image_JPEG($file);

 break;

 case 'png':

 $return = new Image_PNG($file);

 break;

 default:

 echo '图片类型不正确';

 break;

 }

 if($return instanceof IImage){

 return $return;

 }else{

 echo '出错了';

 exit();

 }

 }

 }

 $image = ImageFactory::factory('images/11.jpg');

 var_dump($image->getWidth());

 echo '<br>';

 print_r($image->getheight());

 echo '<br>';

 print_r($image->getData()); 

PHP设计模式之:工厂模式的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. linux IPC总结——管道

    管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ...

  2. 快捷键Ctrl+c、Ctrl+d、Ctrl+u、Ctrl+a、Ctrl+e

    tab:命令或路径补全键 Ctrl +c :终止当前任务命令或程序 Ctrl +d :退出当前用户环境 Ctrl +Shift+c   ssh客户端ssh里复制的命令 Ctrl + a到开头 Ctrl ...

  3. ASP.NET MVC- Controllers and Routing- Routing

    二.Creating Custom Routes In this tutorial, you learn how to  add a custom route to an ASP.NET MVC ap ...

  4. 【转】java 解析 plist文件

    为了方便的将spritesheet的图导入我自己的动画编辑器!我做了plist文件解析DOM解析比较麻烦 因为element getChildNodes 会获取到text对象.而这个对象可能是一个空白 ...

  5. hdu4485 B-Casting(mod运算)

    B-Casting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. Android之PreferenceActivity 详解

    看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找. PerferenceActivity是什么,看下面的截图: ...

  7. IE无法打开internet网站已终止操作的解决的方法

    用IE内核浏览器的朋友,或许不经意间会碰到这样滴问题: 打开某个网页时,浏览器“嘣”跳出一个提示框“Internet Explorer无法打开Internet 站点...已终止操作”.而大多数情况下该 ...

  8. oracle17 视图

    oracle的视图 介绍 视图是一个虚拟表是一个表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在(视图不实际存在).行和列数据 ...

  9. Linux 内核使用的 GNU C 扩展

    gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...

  10. pugixml

    http://www.firedragonpzy.com.cn/index.php/archives/3227 有关cocos2d-x的xml文件读取问题