面向对象的六大原则
- 单一职责原则:避免职责分散,避免承担太多(SRP)
- 开闭原则:模块应对扩展开放,而对修改关闭(OCP)
- 里氏代换原则:子类必须能替换掉父类(LSP)
- 依赖倒转原则:父类不依赖子类,抽象不依赖具体(DIP)
- 接口隔离原则:职业单一,承诺最简(ISP)
- 组合复用原则:尽量使用组合,避免滥用继承(CRP)
设计模式是什么
- 一套被反复使用、多人知晓、经分类编目的代码设计经验的总结
- 设计模式正是对面向对象原则的深入研究和应用
- 并不是说所有的设计模式都得在面向对象时使用, 在面向过程中也可以使用。
- 不要生帮硬套设计模式, 在重构代码时可以考虑设计模式让代码更方便修改和复用
- 设计模式并不高深, 很可能用到了很多模式只是没有提炼出来
设计模式的类型
根据《设计模式 - 可复用的面向对象软件元素》一书中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)
| 序号 | 模式 & 描述 | 包括 |
|---|---|---|
| 1 | 创建型模式 | 工厂模式(Factory Pattern)抽象工厂模式(Abstract Factory Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) |
| 2 | 结构型模式 | 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)过滤器模式(Filter、Criteria Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern) |
| 3 | 行为型模式 | 责任链模式(Chain of Responsibility Pattern)命令模式(Command Pattern)解释器模式(Interpreter Pattern)迭代器模式(Iterator Pattern)中介者模式(Mediator Pattern)备忘录模式(Memento Pattern)观察者模式(Observer Pattern)状态模式(State Pattern)空对象模式(Null Object Pattern)策略模式(Strategy Pattern)模板模式(Template Pattern)访问者模式(Visitor Pattern) |
模式简介/php 代码实现
单例模式
在整个程序的生命周期只允许出现一个实例
迭代器模式
提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示(有多少个元素,每个元素是怎么样的)
工厂模式
简单工厂模式
简单工厂模式:提供一个公共的接口来创建类的实例。
解决的问题:将“类实例化操作”和“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化是需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
优点:
- 使得客户端不必关心如何创建类的实例,屏蔽了一些类实例创建的复杂性
缺点:
- 工厂类集中了所有相关类实例的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 当需要大量相关类实例的创建工作时,工厂类会比较庞大,创建逻辑会比较复杂。
使用场景:
客户端只想传入创建实例的参数,不关心如何创建类实例。
当创建类的实例较少时
工厂方法模式
工厂方法模式:定义工厂父类负责创建类的公共接口,而子类则负责生成具体的对象。
工厂方法模式使得添加类实例创建时不必修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则(开放封闭原则:设计好类后就不再修改,如果有新的需求,通过新加类的方式来满足,而不去修改现有的类(代码))。
解决的问题:克服简单工厂模式的不足,即添加类实例创建逻辑时需要修改公共的工厂类。
优点:
只需要知道对应的工厂名,就可以创建对应的实例。
创建类实例时只需要添加对应的工厂类即可。
缺点:
- 由于创建类时,需要有对应的工厂类,所以系统类的数量会比较多,增加系统的复杂性。
使用场景:
不知道需要创建的类名,只知道某个子类工厂的类名时,可使用工厂方法创建新的实例。
抽象工厂模式
抽象工厂模式:有多个工厂生产产品,每个工厂又有多条产品线生产产品。在抽象工厂模式中,每一个工厂可以创建多个类的实例。适合有很多个类需要创建,多个类实体又可以抽象成一个整体的时候使用。
中介者模式
使用中介类来处理其它类(多个类)的业务逻辑,属于行为型模式。
适配器模式
适配器模式:需要转化一个对象的接口用于另一个对象。使用适配器模式,多个不同的类实现相同的接口。
模板模式
模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
装饰器模式
装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构
装饰模式把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要。
建造者模式
建造者模式:将创建一个对象的复杂过程封装起来,使对象的创建过程与它的表示分离
原型模式
原型模式:用较低成本方式创建高成本的实例。属于创建型模式
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,可以采用这种模式。
组合模式
组合模式:用引用方式而不是继承来构造一个复杂的对象。 相比继承模式,当继承层次多了,子类会继承一些用不到的属性,存在浪费的现象,组合模式就不存在这种情况。组合模式是结构型模式。
外观模式
外观模式:通过向客户端提供一个可以访问的系统的接口来统一处理多个关联对象的逻辑,隐藏系统的复杂性。外观模式属于结构型模式。
