Java中除去有设计原则之外,还有23中设计模式。
这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。
并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。
那我们今天要学习 创建型模式 中的 建造者模式 !
建造者模式:
这个是创建型模式的最后一个模式,建造者模式,我们先来认识一下它
建造者模式定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
这个定义需要大家多读几遍,不是那么容易理解。
这里我来给大家举个栗子,大家好理解。我们呢,现在有一个汽车对象,我们可以知道啊,汽车这个东西是很复杂的,里面有车轮子、发动机、电瓶、车架子......,很多很多啊,我们现在要实例化一下这个汽车对象,其实也是可以的,但是,成本、技术难度,太大太大。所以想要一次性直接实例化是不可选取的,我们可以这样去做,将汽车这个对象进行分解,单独去生产车轮子,单独去生产发动机这些,最后一组装,OK,汽车这个对象就完成了。而且,我们这个汽车还能做更换,好比现在车轮子是用的木头的,我们呢可以将车轮子给他换成橡胶的。
建造者模式的优点和好处:
优点:
1. 各个具体的建造者相互独立,有利于系统的扩展。
2. 客户端不必知道产品内部组成的细节,便于控制细节风险。
好处:
建造者模式呢,将不变和变分离,也就是汽车本身是不变的,变得是车轮子,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
与工厂模式的区别:
建造者模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂模式更注重零部件的创建过程,但两者可以结合使用。
建造者模式的实现:
我们说这个实现之前,还需要说一个,就是建造者模式的组成。
建造者模式由产品、抽象建造者、具体建造者、指挥者这四个部分组成,然后我们来说一下这四个部分指代什么东西
首先是产品,这个好理解,就是我们上面说的内个汽车。
其次是抽象建造者,这个就是一个接口,用来定义需要制造啥,但是不需要它去实现,具体的实现是由具体建造者去实现。
具体建造者,这个其实就不说了,就是实现刚刚抽闲建造者这个接口,然后去做具体的实现。
最后就是这个指挥者,指挥者就是用来调用具体建造者的,先建立啥,再建立啥,不然人家车轮子、发动机都造好了,发现没有车架子不就尴尬了?
下面我们来用Java的代码来说一下上面的这个造汽车。
1. 我们先来创建一个Car,这个就是上面的复杂对象。然后里面现有很多零部件,比如说车轮子,发动机啥的。我们就不把他们定义成对象了,我就用String类型假装一下。
2. 我们知道了这个汽车的组成之后,我们再来创建 抽象建造者。
这里需要注意的是,我们这个汽车这个对象,外界只能通过getCar()这个方法获取,不能随便去拿。
原因很简单,造一个汽车是很复杂的,我们不需要它知道这个造汽车多复杂,你如果需要调用我的方法获取就好了。
我们把造这些车轮啊啥的方法都设定成抽象的,由具体建造者去实现。
3. 有了抽象建造者之后,我们就需要具体建造者去实现了。这里我们来创建一个具体建造者。
然后我们来给每一个方法补充具体的内容。
4. 有了产品,有了抽象建造和,还有了具体建造者之后,我们还差一个指挥者,我们来创建一下指挥者。
指挥者呢,我们需要去指挥怎么去创建,这里我们来写一下
我们定义一个carBuilder,因为我们需要去调用它,然后呢,我们用它来去建造这些个车轮子啊啥的,最后,我们返回这个造好的车。
5. 最后,我们来写一个测试类,我们来使用一下建造者模式
然后我们来运行一下
... 话说,这个不是我们想让他输出的,我们来重写一下Car的toString()方法。然后再运行
到这里为止,我们的建造者模式就学习完了,然后23种设计模式当中的创建型模式也就学习完成了,希望大家好好学习。
ps:上方二维码是我个人的公众号,最近刚开不久,我每个月都会更新一些活动,希望大家可以积极参加,活动详情可以关注公众号之后,回复“活动”二字进行查看,参加。