在开发过程中,如果已知需求和它相应的结构逻辑,那么我们该如何编写出高质量的代码呢?那就要用到设计模式,使用设计模式我们就要明白这三个点。
1.设计模式不是照葫芦画瓢,而是要深刻了解它的思想,理解清楚“它为什么要这样做”。
2.设计模式也像一个统一标准,大家都按照这种思路去开发,那么也比较容易让人理解代码。
3.设计模式和需求密不可分,如果在开发前没有考虑清楚就随便使用一种设计模式,那这个设计模式也许是个鸡肋,搞不好会增加开发难度,特别是结构性设计模式和行为型设计模式。
那么就先介绍一下设计模式有多少类?
设计模式主要分三类:1.创建型设计模式 2.结构型设计模式 3.行为型设计模式
本章先论述创建型设计模式:
一、创建型设计模式
创建型设计模式就和它的名字有关,那就是怎样更好的创建一个类。到这里就有同学问了,创建类不是直接new就行了吗,还需要什么设计模式?
是的,创建类是可以直接new就行了,但是如果遇到一些特殊情况,直接创建会增加你的代码难度,虽说可以解决问题,但是我们作为聪明的软件开发师要考虑有没有更好的办法解决问题。
其实设计模式也有点像“站在巨人的肩膀”,设计模式就是前人想出的解决某种问题的技巧。作为“站在巨人肩膀上的牛顿”的我们就可以运用这种思想去解决问题。
-
单例模式
全局单一实例,常见的做法是把这个类设置为静态对象,以便提供一个全局访问点。
下面我将举例一个场景,假如有一个提示类TipWindow,处理完数据后你就要显示这个提示。但是提示时先把其他提示关闭,防止出现n弹框覆盖的情况,那这种你要怎么实现?那岂不是要一个一个关闭,或者只能不关闭其他弹框?
这种场景就能使用单例模式了,把这个TipWindow做成一个单例,所有调用地方都是用这个单例,显示之前隐藏或更新内容就行,那就可以避免其他弹框可能无法控制关闭的问题。
还有一种情况,假如有一个功能类Http功能类,这个类是访问接口获取数据的类,全局使用的地方比较多。
那如果这种情况下,都需要new这个类,那么频繁使用它这是比较占用资源的,根据Java的机制创建后是不能立马进行回收的,所以这种做法极其不利的。如果把它做成单例,就可避免这种情况的发生。但是它有一个缺点,做成单例后就会一直占用这个实例,并且在多线程情况下创建需要考虑线程安全,不过这些问题都有对应的方法去避免,在必要情况下可以使用弱引用、锁的机制去处理这些问题。
单例模式有两个好处:防止多重调用,减少内存开销
2.构造者模式
将复杂对象的创建和表示分开,使得同样的构建过程可以创建不同的表示。
上面这段话是这个设计模式的概念,有点抽象,有同学会不明白这个是什么意思?我举个例子你就明白了
new Builder().setA().setB().setC()
new Builder().setC().setB().setA()
new Builder().setB().setC().setA()
上面这三种情况就叫不同的“表示”。如果再加上一个构建方法就是下面这种情况
new Builder().setA().setB().setC().build()
new Builder().setC().setB().setA().build()
new Builder().setB().setC().setA().build()
然后上面的概念就讲得通了,同样的构建过程可以有不同的表示,得出的结果是一样的。方法的调用可随便调换顺序,只要后面执行build()就行了。
到这里就会有同学会问,那我们就要明白为什么要用构造者模式呢,感觉用处不是很大?所以在讲之前我们就要解除这个疑惑。
我们前面说了,创建型设计模式主要是对创建类进行设计,那么这个设计模式肯定也是和创建有关。
这个设计模式主要是对复杂对象进行封装,那么下面我将举一个例子:
假如有一个复杂的对象:
public class Song {//歌曲public User user;//用户信息public Singer singer;//歌手信息public Playlist playlist;//歌单}
class Singer{public String singerName;//歌手名 }class User{public String userId;//用户id}class Playlist{private String plName;//歌单名 }
平常我们创建这个类是不是就是下面这种的
Song song = new Song();
Singer singer = new Singer();
singer.siangername = "马丁";
User user = new User();
user.userId="123";
Playlist playList = new Playlist();
playlist.plname = "你好世界!";
song.user = user;
song.singer = singer;
song.playlist = playlist;
那么这个就是我们平常创建一个类的做法,假如有很多地方有创建这个song类,那么这个流程就很繁琐了,然后就有人思考,有没有什么办法把上面的这个流程封装起来,然后构造者模式就诞生了。
下面就举例构造者模式的设计流程:
我们先Song类创建一个内部类,把需要的必需的属性添加到这个类
public class Song {//歌曲public User user;//用户信息public Singer singer;//歌手信息public Playlist playlist;//歌单public static class Builder{private String singerName;private String userId;private String plName;public Builder setSingerName(String singerName){this.singerName = singerName;return this;}public Builder setUserId(String userId){this.userId = userId;return this;}public Builder setPlName(String plName){this.plName = plName;return this;}public Song build(){Song song = new Song();Singer singer = new Singer();singer.singerName = singerName;User user = new User();user.userId = userId;Playlist playlist = new Playlist();playlist.plName = plName;song.singer = singer;song.user = user;song.playlist = playlist;return song;}}}
那么我们以后创建这个类的流程就变成这种方式了:
Song song = new Song.Builder().setSingerName("马丁").setUserId("123").setPlName("你好世界").build();
你是不是震惊了,是不是简便了很多,这就是构造者模式的核心思想,对复杂的对象的创建进行封装,把创建和表示进行分离。
这一章就先讲到这里,下一章我将继续讲解剩下的创建型设计模式。
关注我,并发送24101515即可获取代码