🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
单例模式是一种常用的软件设计模式,是属于创建型模式,其定义是单例对象的类只允许一个实例存在,即实例化出来的对象是唯一的。 特点:(三私一公) * 私有化一个属性用于存放唯一的实例 * 私有化构造函数,防止被直接创建对象 * 私有化克隆方法,防止克隆对象 * 公有化静态方法,用于向系统提供这个实例 优点: * 使用单例模式可以避免大量的new操作,减少消耗资源。 * 在内存里只有一个实例,减少内存的开心,尤其是频繁创建和销毁实例。 * 避免对资源的多重占用,比如写文件操作。 缺点: * 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态 * 单例类的职责过重,在一定程度上违背了单一职责原则 * 如果实例化的对象长时间不被利用,则会被系统回收,这将导致对象状态的丢失 ``` <?php class Person{ static private $instance; //创建静态私有的变量保存该类对象 private $config; //参数 private function __construct($config){ //防止外部代码使用new来创建对象。 echo "我是"; $this -> config = $config; } private function __clone(){ //防止克隆对象 } static public function getInstance($config){ if (!self::$instance instanceof self) {//判断$instance是否是Person的对象,没有则创建 self::$instance = new self($config); } return self::$instance; } public function getName(){ echo $this -> config; } } $db1 = Person::getInstance('Jack'); $db1 -> getName(); echo "<br>"; $db2 = Person::getInstance('John'); $db2 -> getName(); ?> //运行结果: 我是Jack ($db1创建对象后,参数是jack) Jack($db2没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为John) ```