工厂模式:

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

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

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

代码实现

示例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. POJ 3074 Sudoku (Dacing Links)

    推荐一个写数独很好的博客:http://www.cnblogs.com/grenet/p/3163550.html 主要是把九宫格里的元素换到矩阵里面再求解dancing links 网上找的一模版 ...

  2. codeforces 358D

    题目链接:http://codeforces.com/contest/358/problem/D #include<cstdio> #include<iostream> #in ...

  3. 为什么用 Java:一个 Python 程序员告诉你

    这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...

  4. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  5. 【SQL】MySQL内置函数中的字符串函数和日期时间函数

    字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...

  6. Spring学习总结

    spring是当前流行的一个框架.在学习spring之前当然的先准备一些jar包.可以在官网找找,(也可以留言,网盘分享): 基于IDEA环境学习. 第一天完成的任务: 1.使用spring框架输出一 ...

  7. []cp,转载]提示MyEclipse Trial Expired,如何手动获取MyEclipse 注册码!很牛!

    1.建立JAVA Project,随便命名,只要符合规则就行. 2.在刚刚建好的Project右击src,新建一个类,命名为MyEclipseGen,把.java里本来有的代码全部删掉,再把下面的代码 ...

  8. jmeter控制器

    1.仅一次控制器  这个控制器可以保证线程在多次循环跑得情况下只登陆一次 2.循环控制器(Loop Controller:设置循环次数 结果: 3. ForEach控制器(ForEach Contro ...

  9. 原生Javascript插件开发实践

    前言 之前公司设计的网站比较混乱,很多地方不统一,其中一个就是弹出层,导致这个原因是因为,公司的UI换了好几个人,而他们每个人做出来的都不太一样.最近公司开始整顿这个问题,对于统一的这种东西当然是做成 ...

  10. 绘制3D的托卡马克位形图的matlab脚本文件 ThreeD.m

    % 绘制3D的托卡马克位形图, (V 0.1 by Jiale Chan for Y. H. Huang) % Dee Formula % 特征参数     rzero = 2.0;     rmax ...