一、什么是工厂模式
-
工厂模式就是负责生产其他对象的类或方法,常用的工厂模式的一个用法:
<?php class ExportIndustryObj{ public $_obj; public function getObj(){ if(!$this->_obj){ $this->_obj = new Test(); } return $this->_obj; } } class Test{ public function __construct(){ echo 121111; } } $industry = new ExportIndustryObj(); $obj1 = $industry->getObj(); $obj2 = $industry->getObj(); var_dump($obj1,$obj2);
- 上述代码执行后:
-
代码分析:
(1)代码中输出了两个对象,分部是$obj1和$obj2,输出了一次construct中的数字,两个对象编号一样 (2)由此可见,工厂模式可以做到一点,就是只new一次对象
二、对象在内存中是如何分配的呢?
- 内存从分配角度大体可以分为四种类型:栈空间段、堆空间段、代码段、初始化静态段。
- 栈空间段是存储占用相同空间长度并且占用空间较小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。
- 堆空间段是存储数据长度不定且占用空间较大的数据类型,例如对象。
- 代码段是存储执行程序代码本身的地方。
- 数据段是存储初始化且不为0的全局变量,如静态变量和常量。
- 内存分配图示:
- 栈内存是可以直接存取的,而堆内存不可以直接存取。
- 对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象本身是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了
- 对象的图示:
- 上图可以看到,对象名是存在栈中,new了三个person对象,三个具体的对象信息存在堆中。
三、工厂模式与内存分配之间的联系
- 总结起来可以知道,工厂模式就是尽可能的只创建一次对象,从而在堆空间中不用创建重复的对象导致空间浪费,因为堆空间本身是不定长的且空间较大。
- 工厂模式,提取关键词,就是“只new一次对象”、“节省堆空间”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。