设计模式六大原则
- 开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
- 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象.
- 依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
- 单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
- 接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
- 迪米特法则:一个对象应该对其他对象保持最少的了解。
1. Singleton(单例模式)
单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。
使用场景:只实例化一次,内部实例化,对外只有一个开放方法,只能通过调取该方法进行调取实例化对象。数据库连接
简单的记为三私一公一关键:
- 私有静态属性(privite static $instance),又来储存生成的唯一对象
- 公共静态方法(public static function getInstance()),用来访问静态属性储存的对象,如果没有对象,则生成此单例
- 关键词instanceof,检查此变量是否为该类的对象、子类、或是实现接口。
为什么要使用PHP单例模式?
- php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
- 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。
- 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
class Single {
private static $_instance;
public static function getInstance(){
if( empty(self::$_instance) )){
self::$_instance = new self;
}
return self::$_instance;
}
}
2. Factory(工厂模式)
工厂模式是另一种非常常用的模式,正如其名字所示:确实是对象实例的生产工厂。某些意义上,工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现
使用场景:使用方法 new实例化类,每次实例化只需调用工厂类中的方法实例化即可。
优点:由于一个类可能会在很多地方被实例化。当类名或参数发生变化时,工厂模式可简单快捷的在工厂类下的方法中 一次性修改,避免了一个个的去修改实例化的对象。
3. Prototype(原型模式)
有时候,部分对象需要被初始化多次。而特别是在如果初始化需要耗费大量时间与资源的时候进行预初始化并且存储下这些对象,就会用到原型模式:
使用场景:初始化需要耗费大量资源和时间
4. Adapter(适配器模式)
这种模式允许使用不同的接口重构某个类,可以允许使用不同的调用方式进行调用
使用场景:利用接口,将不同的类 组装一组有相同名称的方法 ,利用接口把 PDO mysql mysqli 封装成相同都数据库操作
5. Bridge(桥接模式)
将抽象部分与它的实现部分分离,使他们都可以独立的变抽象与它的实现分离,即抽象类和它的派生类用来实现自己的对象
桥接与适配器模式的关系(适配器模式上面已讲解):
桥接属于聚合关系,两者关联 但不继承
适配器属于组合关系,适配者需要继承源
6. Decorator(装饰器模式)
根据运行时不同的情景动态地为某个对象调用前后添加不同的行
使用场景:symfony 控制器中beforepost afterpost 中post提交前和提交后,对数据处理
7. Facade(门面模式)
门面模式 (Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦
8. Strategy(策略模式)
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式
使用场景:个人理解,策略模式是依赖注入,控制反转的基础
9. Observer(观察者模式)
一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新
使用场景:用户登录,需要写日志,送积分,参与活动 等
使用消息队列,把用户和日志,积分,活动之间解耦合