php发展

首页 » 常识 » 常识 » PHP进阶教程设计模式之单例模式
TUhjnbcbe - 2020/9/22 12:34:00

单例模式,属于创建类型的一种常用的软件设计模式。

通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)

对外提供全局实例的访问入口,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

结构图

主要解决的问题

保证一个类仅有一个实例,并提供一个访问它的全局访问点。避免一个全局使用的类频繁地创建与销毁。

优缺点

优点

单例模式确保同一个进程中同一个对象只有一个实例,阻止其他对象直接new

在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。

避免对资源的多重占用(比如写文件操作)。

缺点

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

注意:

单例类只能有一个实例。

单例类必须自己创建自己的唯一实例。

单例类必须给所有其他对象提供这一实例。

单例类禁止被new,也禁止被clone

实现思路

1、创建一个类,提供一个私有属性用来存储当前类对象实例。

2、把构造方法设置为私有。

3、如果是php语言编写把__clone方法设置为私有(其他语言忽略)。

4、提供一个获取对象方法,在方法里面判断私有属性是否已经实例化成功,如果没有则new,如果有则返回。

示例代码:

Sunny.php

classSunny{privatestatic$instance=null;private$name;privatefunction__construct(){}privatefunction__clone(){}publicstaticfunctiongetInstance(){if(self::$instance==null){self::$instance=newstatic();}returnself::$instance;}/***

returnmixed*/publicfunctiongetName(){return$this-name;}/***

parammixed$name*/publicfunctionsetName($name):void{$this-name=$name;}}

代码调用:

$sunny=Sunny::getInstance();$sunny1=Sunny::getInstance();$sunny-setName("sunny");echo$sunny-getName()."\n";//输出sunnyecho$sunny1-getName()."\n";//输出sunnyvar_dump($sunny===$sunny1);//true

结果输出:

sunnysunnybool(true)

$sunny的结果输出了sunny,$sunny1并没有赋值但是也是得到了sunny结果,因为它们是同一个对象。

两个对象进行对比,它们也是等于true的,说明获取到的都是同一个对象。

如果觉得文章还不错,请把文章分享给更多的人学习,在文章中发现有误的地方也希望各位指出更正。现有误的地方也希望各位指出更正。

预览时标签不可点
1
查看完整版本: PHP进阶教程设计模式之单例模式