设计模式
软件设计原则有哪些?
常⽤的⾯向对象设计原则包括 7个,这些原则并不是孤⽴存在的,它们相互 依赖,相互补充。
- 开闭原则( Open Closed Principle, OCP)
- 单⼀职责原则( Single Responsibility Principle, SRP)
- ⾥⽒替换原则( Liskov Substitution Principle, LSP)
- 依赖倒置原则( Dependency Inversion Principle, DIP)
- 接⼝隔离原则( Interface Segregation Principle, ISP)
- 合成 /聚合复⽤原则( Composite/Aggregate Reuse Principle, C/ARP)
- 最少知识原则( Least Knowledge Principle, LKP)或者迪⽶特法则 (Law of Demeter, LOD)
设计原则名称 | 简单定义 |
---|---|
开闭原则 | 对扩展开放,对修改关闭 |
单一职责原则 | 一个类只负责一个功能领域中的相应职责 |
里氏替换原则 | 所有引用基类的地方必须能透明地使用其子类的对象 |
依赖倒置原则 | 依赖于抽象,不能依赖于具体实现 |
接口隔离原则 | 类之间的依赖关系应该建立在最小的接口上 |
合成/聚合复用原则 | 尽量使用合成/聚合,而不是通过继承达到复用的目的 |
迪米特法则 | 一个软件实体应当尽可能少的与其他实体发生相互作用 |
什么是设计模式?
设计模式( Design pattern)代表了最佳的实践,通常被有经验的⾯向对象 的软件开发⼈员所采⽤。设计模式是软件开发⼈员在软件开发过程中⾯临 的⼀般问题的解决⽅案。这些解决⽅案是众多软件开发⼈员经过相当⻓的 ⼀段时间的试验和错误总结出来的。
设计模式是⼀套被反复使⽤的、多数⼈知晓的、经过分类编⽬的、代码设 计经验的总结。使⽤设计模式是为了重⽤代码、让代码更容易被他⼈理 解、保证代码可靠性。 毫⽆疑问,设计模式于⼰于他⼈于系统都是多赢 的,设计模式使代码编制真正⼯程化,设计模式是软件⼯程的基⽯,如同 ⼤厦的⼀块块砖⽯⼀样。项⽬中合理地运⽤设计模式可以完美地解决很多 问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了
⼀个在我们周围不断重复发⽣的问题,以及该问题的核⼼解决⽅案,这也 是设计模式能被⼴泛应⽤的原因。
设计模式的分类了解吗 ?
- 创建型: 在创建对象的同时隐藏创建逻辑,不使⽤ new 直接实例化对 象,程序在判断需要创建哪些对象时更灵活。包括⼯⼚ /抽象⼯⼚ /单例 / 建造者 /原型模式。
- 结构型: 通过类和接⼝间的继承和引⽤实现创建复杂结构的对象。包 括适配器 /桥接模式 /过滤 器 /组合 /装饰器 /外观 /享元 /代理模式。
- ⾏为型: 通过类之间不同通信⽅式实现不同⾏为。包括责任链 /命名 /解 释器 /迭代器 /中介者 /备忘录 /观察者 /状态 /策略 /模板 /访问者模式。
你知道哪些设计模式?
⼯⼚模式
说⼀说简单⼯⼚模式
简单⼯⼚模式指由⼀个⼯⼚对象来创建实例,客户端不需要关注创建逻 辑,只需提供传⼊⼯⼚的参数。
UML 类图如下:
适⽤于⼯⼚类负责创建对象较少的情况,缺点是如果要增加新产品,就需 要修改⼯⼚类的判断逻辑,违背开闭原则,且产品多的话会使⼯⼚类⽐较复杂。
Calendar 抽象类的 getInstance ⽅法,调⽤ createCalendar ⽅法根据不同 的地区参数创建不同的⽇历对象。
Spring 中的 BeanFactory 使⽤简单⼯⼚模式,根据传⼊⼀个唯⼀的标识来 获得 Bean 对象。
⼯⼚⽅法模式了解吗?
和简单⼯⼚模式中⼯⼚负责⽣产所有产品相⽐,⼯⼚⽅法模式将⽣成具体 产品的任务分发给具体的产品⼯⼚。
UML 类图如下:
也就是定义⼀个抽象⼯⼚,其定义了产品的⽣产接⼝,但不负责具体的产 品,将⽣产任务交给不同的派⽣类⼯⼚。这样不⽤通过指定类型来创建对 象了。
抽象⼯⼚模式了解吗?
简单⼯⼚模式和⼯⼚⽅法模式不管⼯⼚怎么拆分抽象,都只是针对⼀类产 品,如果要⽣成另⼀种产品,就⽐较难办了!
抽象⼯⼚模式通过在 AbstarctFactory 中增加创建产品的接⼝,并在具体⼦ ⼯⼚中实现新加产品的创建,当然前提是⼦⼯⼚⽀持⽣产该产品。否则继 承的这个接⼝可以什么也不⼲。
UML 类图如下:
从上⾯类图结构中可以清楚的看到如何在⼯⼚⽅法模式中通过增加新产品 接⼝来实现产品的增加的。