设计模式之-----建造者模式

来源:互联网 发布:肌研极润怎么样知乎 编辑:程序博客网 时间:2024/06/07 22:24

今天学习了建造者模式,所谓建造者,就是将步骤一样,但是具体内容不一样的方法封装起来。我个人感觉和工厂模式有些相似之处。

首先举个例子,汽车生产的时候,不管什么汽车,组装的步骤,方式,大体上都是一样的,从这个角度来看,宝马汽车和奇瑞QQ就是一样的,他们都是汽车,区别就在于他们的用料,以及具体细节的不同,我们就用这个为例子。我不在过多的解释了,代码里有注释的。

首先看包结构


下边是具体代码:

car类,是所有汽车的抽象

package com.builder.product;import java.util.ArrayList;import java.util.List;/** * 汽车的抽象类,封装了汽车都有的一些共同特征 * @author ZHENGWEI * @date Jul 26, 2015 */public abstract class Car {private List<String> carList = new ArrayList<String>();/** * 最后组装汽车要用的方法 * @param str */public void add(String str){System.out.println("为汽车新增了:"+str);carList.add(str);}/** * 显示汽车由哪些零件组成 */public void show(){for(String str : this.carList){System.out.println(str);}}}

之后是具体的那个汽车

package com.builder.product;public class BMW extends Car{private String str = "增加了宝马特有的安全刹车系统";public BMW(){super();super.add(this.str);}}

package com.builder.product;public class QQ extends Car{//这个就不要在意QQ有没有这个东西了,只是个例子private String str = "奇瑞QQ特有的安全刹车系统";public QQ(){super();super.add(this.str);}}

下面是建造者了,先定义接口

package com.builder.builder;import com.builder.product.Car;/** * 建造者的接口,不管生产什么样子的汽车,这几个步骤是一定要有的 * @author ZHENGWEI * @date Jul 26, 2015 */public interface IBuilder {/** * 增加发动机,每个汽车都需要发动机 */public void addMotor();/** * 增加方向盘 */public void addSteering();/** * 增加车轮 */public void addTyre();/** * 返回car的实例 * @return */public Car getCar();//还有许多零件,这里就不一一列举了。。。}

然后是两个具体实现类

package com.builder.builder;import com.builder.product.BMW;import com.builder.product.Car;/** * 宝马的建造者 * @author ZHENGWEI * @date Jul 26, 2015 */public class BMWBulider implements IBuilder {private BMW bmw = new BMW();public void addMotor() {bmw.add("宝马V8发动机,排量4.0");}public void addSteering() {bmw.add("宝马电动助力方向盘");}public void addTyre() {bmw.add("米其林轮胎,宝马专用版");}public Car getCar() {return bmw;}}

package com.builder.builder;import com.builder.product.Car;import com.builder.product.QQ;/** * QQ的建造者 * @author ZHENGWEI * @date Jul 26, 2015 */public class QQBuilder implements IBuilder {private QQ qq = new QQ();public void addMotor() {qq.add("奇瑞QQ普通发动机,排量1.0");}public void addSteering() {qq.add("奇瑞QQ普通无助力方向盘");}public void addTyre() {qq.add("奇瑞QQ普通轮胎");}public Car getCar() {return qq;}}

之后比较重要的就是导演类了,这个类负责全局的调用和指挥建造者

package com.builder.director;import com.builder.builder.IBuilder;public class Director {private IBuilder builder;/** * 构造方法,传入该接口的实现,即具体的某个生产者 * @param builder */public Director(IBuilder builder){this.builder = builder;}/** * 开始组装,这里,每个汽车的组装方式,组装顺序都是一样的 */public void startAdd(){this.builder.addMotor();this.builder.addSteering();this.builder.addTyre();}}

最后来一个测试类

package com.builder.main;import com.builder.builder.BMWBulider;import com.builder.builder.IBuilder;import com.builder.builder.QQBuilder;import com.builder.director.Director;import com.builder.product.Car;public class BuilderMain {public static void main(String[] args) {IBuilder bmwBuil = new BMWBulider();//宝马Director director = new Director(bmwBuil);director.startAdd();Car bmwCar = bmwBuil.getCar();bmwCar.show();IBuilder qqBuil = new QQBuilder();//QQDirector director1 = new Director(qqBuil);director.startAdd();Car qqCar = bmwBuil.getCar();qqCar.show();}}

最后是结果


原则上来说,这个模式就是封装了不变的,区别的变化的,将变与不变分开,使结构更清晰。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 异地换驾驶证没有居住证怎么办 b2开c1车扣分怎么办 驾照五次没考过怎么办 大车行驶证丢了怎么办 车的产权证丢了怎么办 车子行驶证掉了怎么办 定期的存折丢了怎么办 存折密码输错6次怎么办 营业执照原件丢失怎么办怎么注销 违章扣了14分怎么办 c1驾驶本过期了怎么办 考驾照没带身份证怎么办 上海扣满12分怎么办 美宝旅行证丢失怎么办 汽车证件全丢了怎么办 车的行驶本丢了怎么办 车和行驶证丢了怎么办 考驾照人在外地怎么办 外地考驾照没有居住证怎么办 考驾驶证预约密码忘了怎么办 考驾照密码忘了怎么办 考驾照的密码忘了怎么办 手机银行登录密码忘了怎么办 宽带账号或密码错误怎么办 车险过户联系不上原车主怎么办 换车了etc忘拆了怎么办 c1d驾驶证d证到期了怎么办 摩托车驾驶证过五年怎么办 没居住证想上东莞牌怎么办 外地考驾照需要暂住证怎么办 考驾照期间暂住证过期怎么办 b2驾照扣了6分怎么办 c1驾照扣了11分怎么办 c1驾驶证分扣9分怎么办 驾驶证c照扣6分怎么办 驾照过期1个月怎么办 上海驾驶证b证扣分怎么办 临时牌驾照丢了怎么办 行驶证年审过期两年怎么办 驾证到期了没换怎么办 在非洲被蚊子咬怎么办