工厂模式:

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

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

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

代码实现

示例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. [经典] atoi && itoa

    atoi原型:int atoi(const char *nptr) atoi,需要考虑的内容: 1. 第一个字符为"-"时为负,系数为-1:为"+"时为正,系数 ...

  2. MongoDB:The Definitive Guide CHAPTER 2 Getting Started

    MongoDB is very powerful, but it is still easy to get started with. In this chapter we’ll introduce ...

  3. 398. Random Pick Index

    随机返还target值的坐标(如果存在多个target). 不太明白为什么这个题是M难度的. 无非是要么弄TABLE之类的,开始麻烦点,但是pick的时候直接PICK出来就行了. 要么开始简单点,都存 ...

  4. PAT 1016. Phone Bills

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  5. Java NIO使用及原理分析(三)

    在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等.在本文中我们来看一下缓冲区一些更细节的内容. 缓冲区的分 ...

  6. 推荐一个markdown编辑器-Haroopad

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:推荐一个markdown编辑器-Haroopad.

  7. 食品药检所LIMS需求分析说明书

    1.XX市食品药检所LIMS系统需求分析... 5 1.1检验业务流程... 5 1.1.1样品受理... 5 1.1.1.1选择受理任务... 5 1.1.1.2录入检品信息... 5 1.1.1. ...

  8. Data Types in the Kernel &lt;LDD3 学习笔记&gt;

    Data Types in the Kernel Use of Standard C Types /* * datasize.c -- print the size of common data it ...

  9. android之AlertDialog 点击其他区域自动消失

    遇到一个问题记录下来,在开发中使用了AlertDialog,想点击屏幕其他区域的时候让这个dialog消失,一开始不做任何设置,在小米手机可以正常显示,但是在三星中却有问题,后来发现少了一个属性: V ...

  10. Kali Linux 2.0: 安装之后的操作

    1. 添加官方软件库 1) 编辑/etc/apt/sources.list leafpad /etc/apt/sources.list 2) 用#注释掉原有的内容,并添加下述内容: # Regular ...