工厂模式:

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

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

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

代码实现

示例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. Java学习之路(一) —— Java命名规范

    Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用 ...

  2. C语言中可变参数的用法

    原文地址: http://blog.csdn.net/wooin/archive/2006/04/29/697106.aspx   我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() ...

  3. Triangle - POJ 2954(求三角形内的格子点的个数)

    Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1. 代码如下: -------------------------------------------------- ...

  4. rman进行备份、恢复

    rman备份可以很复杂,但学习需要由浅入深,下面是最常见的几种备份.恢复方式. 备份数据的路径与大小: SQL> show parameter  DB_RECOVERY_FILE_DEST NA ...

  5. Jmeter聚合报告分析

    Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Average:平均响应时间--默认情况下是单个 Re ...

  6. cocos2d-x 2.0.3 设置高清模式注意事项(已移除-hd方式)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=304 在cocos2d-x 2. ...

  7. 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

  8. Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值

    1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对  思路:  A: 获取所有结婚证的集合  B: 遍历结婚证的集合,得到每一个结婚证  C: 根据结婚证获取丈夫和妻子 转换:  A: ...

  9. log4j的properties详细配置,分级输出日志文件

            log4j是很常用的日志类包,在此做一下配置的记录 加载jar包和properities配置文件             将commons-logging.jar和logging-lo ...

  10. 初建FreeMarker工程

    初建FreeMarker工程 ——@梁WP 背景:听说freemarker可以用来写页面的组件,热衷于编写可重用代码的我,迫不及待地研究了freemarker,不过,在写组件之前,还是先研究一下fre ...