文章目录
创建型模式(5种)
什么时候考虑使用创建型模式?
- 当我们需要创建对象时,可以考虑使用以下5个创建型模式中的一个.
1.单例模式
当我们只需要使用一个类对象就足以胜任它在项目中应当完成的所有工作时,我们就可以考虑将这个类设计成单例模式 .
2.抽象工厂模式.
当我们发现可以从所有实体类中抽出某个属性可以将实体类分类时(以手机为例,品牌就是可以抽出的属性),我们就可以考虑使用抽象工厂模式(该模式有个类专用来创建工厂,即创建工厂的工厂类).
3.工厂方法模式
在抽象工厂的基础下,给每个实体类都设计出生成他们的方法放置于对应的工厂类中.
4.建造者模式
举个栗子:以肯德基套餐作为一个类对象,如果把套餐写死(不可更改)显然是不行的(套餐随时会变更),因此我们需要一个可以创建空套餐的方法与可以往空套餐里装配食物的方法,这时候就可以考虑使用建造者模式.
5.原型模式
但貌似和单例模式很像,但是这里必须强调的是:**虽然原型和单例都只有一个类,但是原型模式用的是克隆:即将克隆好的副本对象传出去,原对象没有被改变.单例模式始终只有一个类对象.**当我们发现有一个类要产生对象需要写入很多数据或者需要调用大量函数时,我们就可以考虑使用克隆的方式避免大部分的重复操作,这种实现被称为原型模式.
结构型模式(7种)
什么时候考虑使用结构型模式
- 为了实现程序结构间的松耦合以扩大整体的类结构,我们可以考虑使用以下7种结构型模式中的一种.
1.适配器模式
举个栗子:你有一根数据线它只能给安卓手机充电(数据线类s1,里面有一个给安卓手机充电的方法),现在你想用这根数据线给苹果手机充电,用给安卓充电的方法给苹果充电显然是不行的,怎么办?我们将充电方法重构一下,方法的参数是手机(这是一个基类或者接口),只要是手机(华为,小米等等)都要继承这个类,根据传进来的手机牌子不同调用对应的充电方法,这种实现方法就叫做适配器模式.
2.代理模式
为真实对象提供一个代理对象,从而控制对真实对象的访问.
举个栗子:我要去收快递,我本来可以自己跑去快递中心拿快递,但是太远了(我是类t1,里面有一个get方法返回快递对象,但是执行这个方法很耗时,如果执行了那下面的代码得等一会才能执行了),我不想浪费自己的时间,我让快递小哥送过来给我(因此,我把get这个方法给了快递小哥r1,通过它把结果给我,双线开工岂不美哉).如果为了提高某个核心类的性能我们可以考虑使用代理模式.
3.桥接模式
当我们发现这个系统可以有多个角度分类,每一种角度都有可能变化时,我们可以考虑把这种多角度分类给分离出来让它们独立变化,其实现就是桥接模式.
4.组合模式
将对象组合成树状结构以表示"部分和整体"层次结构,使得客户可以统一的调用叶子对象和容器对象.
举个栗子:我有一个文件夹(整体),文件夹里有视频文件夹(部分),图片文件夹(部分),网页文件夹(部分),这种模块化的设计方法就是组合模式.
5.装饰模式
装饰模式貌似跟建造者模式很像,但他们是有区别的**
建造者模式是有规定的,不是动态的,能加入的部分在类中已经规定好了.
装饰模式是动态的,想往类中加什么就加什么.
建造者模式是将一个复杂对象的构建和它的表示相分离,使得同样的构建过程可以创建不同的表示.
装饰模式是动态的给一个对象添加一些额外额职责,就增加功能来说,装饰模式比生成子类更加灵活**.
6.外观模式
外观模式类似于盒子,对于其子系统而言它不用关心它的上一层实现,只需要调用统一好
的API即可.
举个栗子:我们使用手机的音乐播放功能,我们点击了音乐图标,调用了播放音乐这个API,我们只需知道这个API能播放音乐就够了,怎么播放的我们毫不关心,这就是外观模式.
7.享元模式
当我们发现我们的项目存在着大量引用传递的对象时,我们为了节约内存,有效管理这些对象,提高效率,会把这些对象共享,与单例模式不同单例模式只共享了一个对象,享元模式需要共享多个对象.
行为型模式(11种)
什么时候考虑使用行为型模式
- 当我们为了进一步明确对象的职责,我们会关注系统中对象的相互交互,研究系统运行时对象之间的相互通信和协议.为了达到这个目的,我们可以考虑使用以下11种行为型模式中的一种:
1责任链模式
为了避免请求发送者与接收者过于耦合(意思是发送者类中存在着一个接收者的对象,这种情况我们称之为紧耦合),我们会把对象换成唯一标识符来查找接收者类对象,以遍历的方式一一查找,降低耦合度.这种设计思路就是责任链模式.
2.迭代者模式
为了方便管理,我们会把多个同类型对象放入集合或者数组中,并提供一个方法从中找到我们想要的对象,这种设计思路就是迭代者模式.
3.中介者模式
“有什么问题你跟我说,我转告他”,两个类不再直接相互引用,而是加入一个类作为中介者,通过这个类获得所需对象的引用.这种设计思路就是中介者模式.
4.命令模式
命令模式貌似跟外观模式很像,但它们侧重点不同.外观模式是将命令封装为一个函数,而命令模式是将命令封装为一个类,通过这个类执行命令.
5.解释器模式
对于有特殊含义的字符,你要写方法来告诉程序要如何解释运行.比如+号,如果没有解释方法它只是一个字符,有了解释方法它才是运算符,只要你的项目存在这样的方法并实现了解析,那你就可以说使用了解释器模式.
6.访问者模式
将一个对象设计为不可更改的对象,这种设计思路称为访问者模式.
7.策略模式
定义一系列的算法,并将每个算法封装在一个类中,根据对应场景调用特定算法.这种设计思路被称为策略模式.
8.模板方法模式
定义一个操作的算法骨架,将这些易变的步骤延迟到子类具体实现.
举个栗子:已知去银行办理业务一定会经历三个步骤:1.排队取号,办理业务,给银行人员好评.但是办理业务这一步是不固定的,可以是存钱,也可以是取钱.像这种可以抽象成方法但是内部部分业务逻辑不固定的情况下就可以使用模板方法模式.
9.状态模式
允许一个对象在其内部状态改变时改变它的行为.
10.观察者模式
当一个对象状态改变时,其相关依赖对象皆得到通知并自动更新.
11.备忘录模式
捕获一个对象的内部状态,并且保存.具有回滚的功能,需要时,可以恢复到保存时的状态.