学习是人类生命中不可或缺的一部分,而学习关键词更是在现代社会中越来越受到关注。学习关键词不仅可以帮助我们更好地理解和运用知识,还可以提高我们的竞争力和创造力。那么如何有效地学习关键词呢?以下是几个建议:
理解关键词的定义和背景
在学习关键词之前,首先需要明确关键词的定义和背景。关键词是一种特殊的词汇,可以用来概括文章、主题、产品或服务的本质特征。了解关键词的背景可以帮助我们更好地理解其含义和作用。
研究相关文献和资料
研究相关文献和资料是学习关键词的重要途径。通过阅读专业书籍、学术论文和案例分析,可以深入了解关键词的概念、应用和发展趋势。同时,我们还可以借鉴其他人的经验和思路,拓展自己的知识面和视野。
练习运用关键词
学习关键词不仅是为了理解和掌握其概念,更重要的是能够熟练地运用它们。在日常生活和工作中,我们可以尝试使用关键词来概括和描述事物,或者将其应用于自己的创作和实践中。只有不断地练习和运用,才能真正掌握关键词的精髓。
参与相关活动和交流
参与相关活动和交流可以帮助我们更好地了解关键词的最新发展和应用。可以加入相关的学术组织、参加专业培训和讲座、参与线上讨论和社交媒体等。通过交流和互动,我们可以与同行、专家和学者交流意见和分享经验,不断完善自己的学习和应用能力。
总之,学习关键词是一项长期而繁琐的过程,需要不断地学习、练习和交流。只有在不断地积累和实践中,才能真正掌握关键词的核心和应用,提高自己的学术水平和职业能力。
文章结束。
前言
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。 Gof类图及解释 GoF定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象GoF类图
abstract class Prototype { public $v = 'clone' . PHP_EOL; public function __construct() { echo 'create' . PHP_EOL; } abstract public function __clone(); }
class ConcretePrototype1 extends Prototype { public function __clone() { } } class ConcretePrototype2 extends Prototype { public function __clone() { } }
class Client { public function operation() { $p1 = new ConcretePrototype1(); $p2 = clone $p1; echo $p1->v; echo $p2->v; } } $c = new Client(); $c->operation();
- 原型模式看似就是复制了一个相同的对象,但是请注意,复制的时候,__construct()方法并没有被调用,也就是当你运行这段代码的时候,create只输出了一次。这也就带出了原型模式最大的一个特点――减少创建对象时的开销。
- 基于上述特点,我们可以快速的复制大量相同的对象,比如要给一个数组中塞入大量相同的对象时。
- 复制出来的对象中如果都是值类型的属性,我们可以任意修改,不会对原型产生影响。而如果有引用类型的变量,则需要在__clone()方法进行一些处理,否则修改了复制对象的引用变量中的内容,会对原型对象中的内容有影响。
原型模式生产手机类图
<?php interface ServiceProvicer { public function getSystem(); } class ChinaMobile implements ServiceProvicer { public $system; public function getSystem(){ return "中国移动" . $this->system; } } class ChinaUnicom implements ServiceProvicer { public $system; public function getSystem(){ return "中国联通" . $this->system; } } class Phone { public $service_province; public $cpu; public $rom; } class CMPhone extends Phone { function __clone() { // $this->service_province = new ChinaMobile(); } } class CUPhone extends Phone { function __clone() { $this->service_province = new ChinaUnicom(); } } $cmPhone = new CMPhone(); $cmPhone->cpu = "1.4G"; $cmPhone->rom = "64G"; $cmPhone->service_province = new ChinaMobile(); $cmPhone->service_province->system = 'TD-CDMA'; $cmPhone1 = clone $cmPhone; $cmPhone1->service_province->system = 'TD-CDMA1'; var_dump($cmPhone); var_dump($cmPhone1); echo $cmPhone->service_province->getSystem(); echo $cmPhone1->service_province->getSystem(); $cuPhone = new CUPhone(); $cuPhone->cpu = "1.4G"; $cuPhone->rom = "64G"; $cuPhone->service_province = new ChinaUnicom(); $cuPhone->service_province->system = 'WCDMA'; $cuPhone1 = clone $cuPhone; $cuPhone1->rom = "128G"; $cuPhone1->service_province->system = 'WCDMA1'; var_dump($cuPhone); var_dump($cuPhone1); echo $cuPhone->service_province->getSystem(); echo $cuPhone1->service_province->getSystem();
说明
- 打印了很多东西呀,不过主要的还是看看移动手机,也就是CMPhone中的__clone()方法,我们没有重新去初始化一个新对象。这时,复制的图片cmPhone中的是同一个对象。没错,这就是引用的复制问题。引用只是复制了引用的地址,他们指向的是同一个对象。当图片cmPhone里面的service_province对象里面的属性也跟着改变了。
- 在CUPhone中,我们重新new了一个新的service_province对象。这次外面的图片cuPhone中引用对象的值。
- 原型模式中最主要的就是要注意上述两点,而普通的值属性会直接进行复制,不会产生这个问题。这里又牵涉出另外两个概念:浅复制和深复制
- 浅复制,是指被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象
- 深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
- 关于引用和值的问题,我们将在其他的文章中进行讲解