工厂模式:

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

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

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

代码实现

示例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. Android JNI 由C/C++本地代码向Java层传递数据

    最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为 参数一:int型: 参数二: 通信指令,本地代码中为unsi ...

  2. 一个简单的DELPHI程序注册码设计 .

    当你辛辛苦苦用DELPHI做好了一个你认为十分不错的程序,你是否想把它发布出去成为共享软件呢  做为一个共享软件,注册码肯定是少不了的,你可以通过判断程序是否注册来进行功能,时间或一些其它限制.现在就 ...

  3. 简单的ALloctor模板

    template <typename T>class Alloctor{private: typedef T* address; T *memory,*t; size_t total_si ...

  4. hdoj 1054 Strategic Game【匈牙利算法+最小顶点覆盖】

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. Sublime Text 3 格式代码插件 codeFormatter

    一款可以对html.JS.CSS.PHP.python代码格式化的sublime插件 默认快捷键ctrl+alt+F,默认可以对html.js.css格式代码, 如果想对PHP格式化,需要PHP5.6 ...

  6. C语言之void类型及void指针 分类: C/C++ 2015-07-13 11:24 8人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/pengyingh/articles/2407267.html 1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在 ...

  7. windows 下一个 easy_install 设备

    下载安装python安装工具 1,方法是下载ez_setup.py后 2,在cmd下运行 python ez_setup.py.就可以自己主动安装setuptools 3,环境变量设置将 C:\Pro ...

  8. android 61 logcat

    package com.itheima.logcat; import android.os.Bundle; import android.app.Activity; import android.ut ...

  9. mybatis09

    1mybatis开发dao的方法 .1SqlSession作用范围 是使用局部变量.成员变量,还是形参? 1.1.1SqlSessionFactoryBuilder SqlSessionFactory ...

  10. MYSQL学习笔记3--mysql 2PC二阶段协义 与 日志闪回

    mysql两份日志: binlog :server innodb redo log:engine 两份日志顺序一致性:否则主备不一致 两份日志:原子性,同时都有,同时都无 2PC二阶段协义: 第一阶段 ...