第九章:生成对象
笔记
单例模式
- 使用场景:只需要一个类实例。
现实场景有很多,但是归根结底就是我们希望全局访问的对象都是同一个对象,而不是同一个类生成的多个可能相同的对象。
<?php
class Preferences{
private $props=[];
private static $instance;
/**
* 设置成 private 就可以保证用户无法实例化该类
* Preferences constructor.
*/
private function __construct(){
}
/**
* 设置一个静态方法实例化自己
* @return Preferences
*/
public static function getInstance(){
if(!self::$instance){
self::$instance=new Preferences();
}
return self::$instance;
}
public function setProperty($key,$value){
$this->props[$key]=$value;
}
public function getProperty($key){
return isset($this->props[$key])?$this->props[$key]:"";
}
}
/**
* 下面来演示一下
*/
// 定义一个变量
$preference1=Preferences::getInstance();
// 设置类的属性
$preference1->setProperty("show","hello world !");
// 移除变量
unset($preference1);
// 重新定一个变量
$preference2=Preferences::getInstance();
// 获取值,值依然有效
print $preference2->getProperty("show");
工厂模式方法
- 使用场景:当有多个子类实现一个抽象类,并需要判断实例化哪个子类时,就会考虑使用工厂模式方法。
实例1
<?php
/**
* 原先理解的工厂模式
*/
class BloggsApptEncode{
}
class MegeApptEncode{
}
class CommsManager{
const BLOGGS=1;
const MEGA=2;
private $mode=1;
/**
* 指定要实例化的子类
* CommsManager constructor.
* @param $mode
*/
public function __construct($mode)
{
$this->mode=$mode;
}
/**
* 获取类的实例
* @return BloggsApptEncode|MegeApptEncode
*/
public function getApptEndCode(){
// 任何工厂方法,判断是不可避免的
switch ($this->mode){
case self::BLOGGS:
return new BloggsApptEncode();
break;
case self::MEGA:
return new MegeApptEncode();
break;
}
}
}
$instance=new CommsManager(CommsManager::MEGA);
$apptEncode=$instance->getApptEndCode();
上面的代码是没有问题的,但是如果又加了一些新的需求,导致你的代码成了这个样子,那么你就需要考虑别的实现方式了:
<?php
/**
* 原先理解的工厂模式
*/
class BloggsApptEncode{
}
class MegeApptEncode{
}
class CommsManager{
const BLOGGS=1;
const MEGA=2;
private $mode=1;
/**
* 指定要实例化的子类
* CommsManager constructor.
* @param $mode
*/