一 : 《PHP设计模式介绍》第四章 单件模式
几乎所有面向对象的程序中,总有一两个资源被创建出来,在程序应用中持续被共享使用。例如,这样的一个资源,在一个电子商务程序的数据库连接中使用:这个连接在应用程序启动时初始化,程序于是可以有效的执行;当程序结束时,这个连接最终被断开并销毁。如果是你写的代码,没必要在每时每刻创建一个数据库连接,这样非常低效。已经建立好的连接应该能被你的代码简单重复的使用。这个问题就是,基于以上要求你将如何进行这个数据库连接?(或者连接其它被循环使用的唯一资源,比如一个开放文件或者一个队列。)
问题
你怎样确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且它很存取容易呢?
解决方案
当然,全局变量是显而易见的解决方案。但它就像潘多拉的盒子(正确的判断来自经验,而错误的判断产生经验。这句谚语就是这个意思。),你的任何代码都能修改全局变量,这将不可避免的引起更多调试的意外。换句话说,全局变量的状态总是会出现一些问题的,(这里有一个关于全局变量使用问题不错的描述,http://c2.com/cgi/wiki?GlobalVariablesAreBad)。
当你需要一个特殊类的唯一实例时,使用这个名字叫单件的模式。基于单件模式的类能实例化和初始化这个类的一个实例,并且提供每时每刻绝对相同的连接。一般情况下使用名为getInstance()的静态方法实现。
关键问题是,如何在每时每刻获得一个精确统一的实例。请看下面的例子:
class DbConn { |
注释:assertReference
assertReference() 方法确保两个被传递的参数引用自相同的PHP变量。
在PHP4中,这里断言两个被测试的参数的却是相同的对象。assertReference() 这个方法在移植到PHP5以后也许就不推荐使用了。
这个test方法有两个断言:第一个判断第调用静态方法DbConn::getInstance()返回的值是DbConn对象的实例,第二个用来判断第二次调用getInstance()方法返回得值引用的是相同的对象实例,这意味着他们使用的是同一个对象。
除了断言代码预期的执行结果,Test也预示了getInstance()的正确用法(PHP4):$local_conn_var=&DbConn::getInstance()。引用(=&)静态方法的返回值赋值给了这个局部变量。
再写另外一段测试代码:直接用“new”来实例化一个单件类会引起某些类型的错误。test代码如下:
function TestBadInstantiate() { $obj =& new DbConn; $this->assertErrorPattern( ‘/(bad|nasty|evil|do not|don’t|warn).*’. ‘(instance|create|new|direct)/i’); } |
样本代码
单件模式是一个很有趣的模式。让我们用PHP4和PHP5两种方式来探究它的实现过程,现在从PHP4开始。
全局方式
理论上说,一个全局变量可以生成一个完美的单件,但全局变量可能被修改:在代码运行过程中,不能保证全局变量指向的是一个对象。因而,不让全局变量在全局直接引用,就可以减少“太随意访问”这个全局变量的问题。比如说,这段代码使用一个非常长而且独特的名字,从而“隐藏”了全局变量的引用。
class DbConn { function DbConn($fromGetInstance=false) { if (M_E != $fromGetInstance) { trigger_error(‘The DbConn class is a Singleton,’ .’ please do not instantiate directly.’); } } function &getInstance() { $key = ‘__some_unique_key_for_the_DbConn_instance__’; if (!(array_key_exists($key, $GLOBALS) && is_object($GLOBALS[$key]) && ‘dbconn’ == get_class($GLOBALS[$key]) )) { $GLOBALS[$key] =& new DbConn(M_E); } return $GLOBALS[$key]; } } |
表示成一个UML类图,解决办法如下:
如果你不选用这个“神秘参数”-类型保护,建立一个全局标记是另外一个选择,用它来验证你是通过getInstance()方法来创建的对象。保护方式从“你知道它的名字”改变成“它存在于环境中”。
下面有个例子,它解释了为什么构造函数保护代码有一个全局的标识:
class DbConn { |
PHP4允许你改变构造函数中$this的值。在过去,我们会习惯设置 $this = null;当有一个创建构造错误时,确保无效的对象不能被代码继续使用。PHP4中很有用的东西,在PHP5中并不兼容,将来会在你的代码中得到验证,这种技术不再被推荐。
这段代码中另外一个重点是引用操作&的用法。有两种地方需要使用&。第一种是在函数定义时,在函数名字前用来表示将返回一个引用。第二种是将新的DbConn对象赋值给$GLOBALS数组。(在序言和值对象章节中提到过:在PHP4中,你总会使用&操作符,以引用的方式创建、传递和返回对象,)
getInstance()方法的条件检查,常常被写成没有警示的情况下运行,甚至在E_ALL的错误级别下也不会提示。它检查在$GLOBAL数组中适当的位置是否有一个DbConn对象,如果没有,就在那里创建这个对象。这个方法于是返回了这样的结果,这个对象能被重复创建或者这个对象在之前已经被这个方法创建过了。当方法结束时,你可以确认已经拥有这个类的有效实例,而且它已经被有效初始化。
静态方式
关于全局变量的问题,甚至隐藏在getInstance()中的全局变量中也存在。因为全局变量在脚本的任何地方都有效,在没有注意到的情况下,你依然有可能破坏这个全局变量,
在getInstance()方法内部使用静态变量来存储Singleton是一个显得干净的办法。第一个代码片断如下:
class DbConn { // ... function &getInstance() { static $instance = false; if (!$instance) $instance =& new DbConn(M_E); return $instance; } } |
class DbConn { function DbConn($fromGetInstance=false) { if (M_E != $fromGetInstance) { trigger_error(‘The DbConn class is a Singleton,’ .’ please do not instantiate directly.’); } } function &getInstance() { static $instance = array(); if (!$instance) $instance0 =& new DbConn(M_E); return $instance0; } } |
虽然这段代码有点依赖PHP的布尔方式,但它比那个全局版本更严谨:在条件检测时,使用一个空的数组会得到结果false。就像在DbConn类的前一个版本一样,在函数的定义和赋值部分需要引用操作符。
PHP5中的单件模式
PHP5中更容易实现单件模式,PHP5对于类内部变量和函数的访问控制被加强了。将DbConn::_construct()构造方法设置为私有(private),这个类就不能被直接实例化。用UML图表示,PHP5的DbConn单件模式如下:
组合使用静态方法和静态变量保持这个实例,并且设置构造函数为私有,以防止直接实例化类而创建实例,代码如下:
class DbConn {
/**
* static property to hold singleton instance
*/
static $instance = false;
/**
* constructor
* private so only getInstance() method can instantiate
* @return void
*/
private function __construct() {}
/**
* factory method to return the singleton instance
* @return DbConn
*/
public function getInstance() {
if (!DbConn::$instance) {
DbConn::$instance = new DbConn;
}
return DbConn::$instance;
}
}
结论
现在你已经看到几种单件设计模式的实现方式了,当你着眼于实现这个设计模式时候,我们要仔细权衡考虑。
首先,一个单件对象不是一个“很好的”全局变量。举例来说,如果一个方法需要一个单件对象,更显而易见的用法是把它当作一个参数传递来使用。
同样,因为它可以在“全局”得到使用,你很容易就会将所有种类的“常用函数”放置到一个单件类中。这个是你需要避免的,需要的时候,你才把函数封装单件类中。
Monostate Pattern(单态模式):类单件模式
有时候,我们需要这样一个类,所有类的实例都共享它的全局状态――换句话说,它所产生的任何实例返回严格一致的信息。和单件模式类似,这是一种叫做MonoState(单态)的模式。在PHP中,你使用一种优美的引用技巧来绑定全局数据,通过把一个全局变量绑定到一个实例变量来实现MonoState。
举个例子,让我们创建一个全局应用配置类。无论你用MonoState类的哪个实例,你都能得到同样的值。
下面的测试代码用来验证次功能:
// PHP4 function TestApplConfig() { $this->assertIsA( $obj1 =& new ApplicationConfig, ‘ApplicationConfig’); $this->assertIsA( $obj2 =& new ApplicationConfig, ‘ApplicationConfig’); $test_val = ‘/path/to/cache’.rand(1,100); $obj1->set(‘cache_path’, $test_val); $this->assertEqual($test_val, $obj2->get(‘cache_path’)); } |
下面这段代码实现了MonoState:
class ApplicationConfig { var $_state; function ApplicationConfig() { $key = ‘__stealth_singleton_state_index__’; if (!(array_key_exists($key, $GLOBALS) && is_array($GLOBALS[$key]))) { $GLOBALS[$key] = array(); } $this->_state =& $GLOBALS[$key]; } function set($key, $val) { $this->_state[$key] = $val; } function get($key) { if (array_key_exists($key, $this->_state)) { return $this->_state[$key]; } } |
这个技巧能够在任何PHP的自动全局(superglobal)数组使用,尤其在用户消息队列$_SESSION中有很显著的效果。MonoState能通过你的代码为用户存储一系列的使用信息(你要显示的信息可能是从另外一个页面传入的)。$_SESSION是一个存储这些信息的好地方,以方便这些信息在页面跳转后能持续使用。
这个技巧的核心是$this->state =& $GLOBALS[$key]; 。在确定$GLOBALS[$key]是一个数组后,代码绑定一个全局数组的引用给类变量$this->state。从而,任何$this->state的改变都自然而言地同步到全局数组,包括类的其它实例。Test创建了MonoStatel类的两个不同实例,改变其中一个,验证另外一个是否也一起被改变了。这段代码很简单的选择了这个静态数组$instancede的第一个元素,用来保持单件DbConns实例的引用。Zend 1引擎在PHP4中不能存储静态变量的引用 (请看http://www.php.net/manual/en/language.variables.scope.php#AEN3609)。使用一个工作区存储静态数组,并且将这个单件实例的引用放置到一个已知的数组中。getInstance()方法如下:提示在DbConn的构造函数中,你可能对$fromGetInstance的默认参数感到疑惑。在对象被直接实例化时,它能够提供(很微弱的)保护:除非这个默认值变成e (在PHP的数学常量中 M_E = 2.718281828459),否则这段代码会报错。这段代码直接创建了一个 DbConn 的实例,将会引起PHP报错。为了让代码更稳定,我们用PCRE正则表达式来匹配报错信息。(显示报错信息的确切措词并不重要。)二 : 请问哪些行业与 模具设计与制造专业 有关的?
关于模具设计按国家职业定义,模具设计是:从事企业模具的数字化设计,包括型腔模与冷冲模,在传统模具设计的基础上,充分应用数字化设计工具,提高模具设计质量,缩短模具设计周期的人员。模具设计与制造专业主要课程培养模具设计与制造的高级应用型技术人才,可从事企业生产所需模具及其工装的设计与制造,模具装配与调试、模具企业经营与管理工作。 主要课程有:机械制图、机械设计与基础、冷冲模设计与制造、注塑模设计与制造、数控技术与编程、模具加工机械、电工与电子技术、液压与气动传动、金属切削原理、机械CAD/CAM等。模具设计与制造专业相关行业金属产品制造业、塑料产品制造业、橡胶产品制造业、陶瓷产品制造业、玻璃产品制造业及各种包装产品。同时,模具技术集设计、制造、产品造型、软件应用为一体,集先进制造技术运用为一体。
就业方向模具加工方向:模具加工生产组织、模具数控编程加工、模具三维设计、产品开发三维设计。
其他技术类方向:生产管理、物流管理、设备管理、质量管理、项目管理以及产品开发、汽车工业、机械制造工艺师、CNC工程师等。
三 : 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示 61阅读提醒您本文地址:
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
家具设计软件 家具设计软件_专注定制家具设计_功能介绍及演示
61阅读提醒您本文地址:
四 : 模具设计与制造专业自我评价
我来自xxxx,就读于xxx学校,所学专业,模具设计与制造,从事机械工作三年,现已修完所学专业,自我评价如下:
思想方面,努力学习党的xx大精神,遵纪守法,努力回报社会。
学习方面,努力学完学校所开的每一门专业,可真正为社会服务。
卫生方面,积极参加环保活动,爱护环境卫生。
其他方面,有较强的集体荣誉感和团队精神,对工作尽职尽责,忠于职守,有较强的管理能力和创新意识。
本人热心、自信、上进心强,工作认真负责,具有良好的团队合作精神与较好的个人亲和力;举止优雅,有亲和力,精力充沛,做事有条理,责任感强;具有优秀的思维、沟通和学习能力,热爱团队工作。对于网络文化有着浓厚兴趣,善于与人沟通,能够感受前卫文化、科技潮流带来的乐趣。同时对创意有着自我的分析和见解,愿意和大家一起分享思维的感受。
五 : 模具设计与制造专业个人简历表格
个人基本简历 |
姓名: | - | 国籍: | 中国 | 无照片 61阅读 |
目前所在地: | 广州 | 民族: | 汉族 | |
户口所在地: | 广东省 | 身材: | 170 cm kg | |
婚姻状况: | 未婚 | 年龄: | 24 岁 | |
培训认证: | 诚信徽章: |
求职意向及工作经历 |
人才类型: | 普通求职 | ||||||||||||||||||||||||||||||||||||
应聘职位: | 机械/设备维修类:外观设计、结构设计 | ||||||||||||||||||||||||||||||||||||
工作年限: | 4 | 职称: | 无职称 | ||||||||||||||||||||||||||||||||||
求职类型: | 全职 | 可到职- | 一个星期 | ||||||||||||||||||||||||||||||||||
月薪要求: | XX--3500 | 希望工作地区: | 广东省 | ||||||||||||||||||||||||||||||||||
个人工作经历: |
| ||||||||||||||||||||||||||||||||||||
教育背景 |
毕业院校: | 十堰职业技术学院 | ||||||||||||||
最高学历: | 大专 | 毕业- | XX-07-01 | ||||||||||||
所学专业一: | 模具设计与制造 | 所学专业二: | |||||||||||||
受教育培训经历: |
| ||||||||||||||
语言能力 |
外语: | 英语 一般 | ||
国语水平: | 一般 | 粤语水平: | 一般 |
工作能力及其他专长 |
主要技能:钣金手板制作,装配样机,AUTOCAD,PRO/E XX,野火版2.0,3.0操作软件。 业余爱好:乒乓球、羽毛球、篮球、登山、旅游等。 自我评价:责任心强,人缘好,好奇心强,喜欢钻研问题,愿为贵公司的事业发展添砖加瓦。 | |
详细个人自传 |
月薪要求:3000元 工作地区:珠三角地区 | |
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1