前言
什么东西,什么事物都是有正反两面的,设计模式也不例外,也是既有优点,又有缺点,当然也有该用它的场合。
1. 工厂方法模式
优点:使用工厂方法模式,创建客户所需产品,用户只需关心产品对应的工厂,其他都不用知道。添加新产品时,只需添加一个具体工厂和一个具体产品即可。
缺点:添加新产品时,需要同时添加具体工厂和具体产品,所以系统中类的个数是成对增加,增加了系统的复杂度。
适用场景:客户端不知道它所需要的对象的类。
2. 抽象工厂模式
优点:易于交换产品系列;使具体的创建实例过程与客户端分离
缺点:实现增加功能时,需改动的地方比较多
适用场景:系统功能结构稳定,不需新增功能
3. 建造者模式
优点:使建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以。
缺点:如果产品内部变化复杂,会增加系统的难度和运行成本
适用场景:创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式;产品有较多的共同点,组成部分相似
4. 原型模式
优点:创建通过复制,可以提高新建的效率
缺点:克隆位与类内部,不易于修改源代码
适用场景:对象相似,可以通过复制,加修改实现的
5. 单例模式
优点:节约系统资源,提高系统性能
缺点:不易扩展
适用场景:系统只需一个实例对象
6. 适配器模式
优点:灵活性、扩展性好
缺点:不支持多重继承
适用场景:系统的数据和行为都正确,但接口不符。主要应用于希望复用一些现存的类,但是接口由于复用环境不一致的情况。
7. 装饰模式
优点:把类中的装饰功能搬移去除,这样可以简化原有的类;有效的把类的核心职责和装饰功能区分开了;可以去除相关类中重复的装饰逻辑。
缺点:容易出错
适用场景:当系统需要新功能的时候,新加的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。
8. 桥接模式
优点:减少耦合
缺点:增加系统的理解与设计难度
适用场景:系统可能有多角度分类,每一种分类都有可能变化。
9. 组合模式
优点:一致地使用组合结构和单个对象
缺点:建含有特定对象的类难以实现
适用场景:树形结构,需求中是体现部分与整体层次的结构时,并且希望用户可以忽略组合对象与单个对象的不同,统一地使用结构中的所有对象时,考虑用组合模式
10. 享元模式
优点:节约存储空间
缺点:享元模式需要维护一个记录了系统已有的所有享元的列表,这本身需要耗费资源,享元模式使得系统更加复杂。
适用场景:一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销;对象的大多数状态可以外部状态,如果删除对象的外部状态,可以用相对较少的共享对象取代很多组对象
11. 代理模式
优点:降低耦合度,扩展性好
缺点:处理速度变慢
适用场景:远程代理,也就是为一个对象在不同的地址空间提供局部代表;虚拟代理,是根据需要创建开销很大的对象;安全代理,用来控制真实对象访问时的权限;智能指引,是指调用真实的对象时,代理处理另外一些事。
12. 外观模式
优点:降低耦合度
缺点:降低了灵活性
适用场景:设计初期,应该有意识的将不同的层分离;开发期,子系统往往因为不断地重构演化而变得越来越复杂;维护期,系统难以维护和扩展。
后记
使用设计模式,可以让我们的代码更优,但一定不能乱用,要在合适的时候,该用的情况下使用设计模式。
设计原则理念
单一职责原则告诉我们实现类要职责单一;
里氏替换原则告诉我们不要破坏继承体系;
依赖倒置原则告诉我们要面向接口编程;
接口隔离原则告诉我们在设计接口的时候要精简单一;
迪米特法则告诉我们要降低耦合;
而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
网友评论