Java设计模式(3)建造者模式(Builder模式) http://www.cnblogs.com/Coda/p/4283025.html
Java 设计模式 — 建造者模式 http://www.jianshu.com/p/7d16da4e61b8
设计模式-建造者模式
建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:
还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:
还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:
测试类:
从这点看出,建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。所以与工程模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。因此,是选择工厂模式还是建造者模式,依实际情况而定。
自己的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
package com.pandy.module.build;/** * Created by pandy on 17-6-23. */ /** * 项目名称: idea * 功能说明: 要构造的产品 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-6-23. * 创建时间: 下午1:19. * 修改历史: * ----------------------------------------------- */ public class Product { //基础信息 private String name; private String type; private String no; //复杂的产品信息 private String partA; private String partB; private String partC; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } @Override public String toString() { return "Product{" + "name='" + name + '\'' + ", type='" + type + '\'' + ", no='" + no + '\'' + ", partA='" + partA + '\'' + ", partB='" + partB + '\'' + ", partC='" + partC + '\'' + '}'; } public String getPartA() { return partA; } public void setPartA(String partA) { this.partA = partA; } public String getPartB() { return partB; } public void setPartB(String partB) { this.partB = partB; } public String getPartC() { return partC; } public void setPartC(String partC) { this.partC = partC; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com.pandy.module.build;/** * Created by pandy on 17-6-23. */ /** * 项目名称: idea * 功能说明: 构造接口 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-6-23. * 创建时间: 下午1:22. * 修改历史: * ----------------------------------------------- */ public interface Builder { /** * 产品的初始化,提供一个机会,但不是必须的 * @param name * @param type * @param no */ public void init(String name, String type, String no); /** * 最后读取产品 * @return */ public Product getResult(); /** * 构造A部分 */ public void buildPartA(); /** * 构造A部分 */ public void buildPartB(); /** * 构造C部分 */ public void buildPartC(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
package com.pandy.module.build;/** * Created by pandy on 17-6-23. */ /** * 项目名称: idea * 功能说明: 业务的创建类, 要实现接口 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-6-23. * 创建时间: 下午1:27. * 修改历史: * ----------------------------------------------- */ public class BisBuilder implements Builder { private Product product=new Product(); @Override public void init(String name, String type, String no) { product.setName(name); product.setType(type); product.setNo(no); } @Override public Product getResult() { return product; } @Override public void buildPartA() { System.out.println("Start PartA"); product.setPartA("A部分信息"); try { Thread.sleep(2000); }catch (Exception e){ } System.out.println("end PartA"); } @Override public void buildPartB() { System.out.println("Start PartB"); product.setPartB("B部分信息"); try { Thread.sleep(2000); }catch (Exception e){ } System.out.println("end PartB"); } @Override public void buildPartC() { System.out.println("Start PartC"); product.setPartC("C部分信息"); try { Thread.sleep(2000); }catch (Exception e){ } System.out.println("end PartC"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package com.pandy.module.build;/** * Created by pandy on 17-6-23. */ /** * 项目名称: idea * 功能说明: 导演者,对构建类进行封装, 然后做构造的总指挥 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-6-23. * 创建时间: 下午2:04. * 修改历史: * ----------------------------------------------- */ public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } /** * 如果需要,可以传参数 */ public void construct(){ System.out.println("---> start construct......"); builder.buildPartA(); try { Thread.sleep(2000); }catch (Exception e){ } builder.buildPartB(); try { Thread.sleep(2000); }catch (Exception e){ } builder.buildPartC(); try { Thread.sleep(2000); }catch (Exception e){ } System.out.println("---> end construct......"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com.pandy.module.build;/** * Created by pandy on 17-6-23. */ /** * 项目名称: idea * 功能说明: 导演者,对构建类进行封装 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-6-23. * 创建时间: 下午2:04. * 修改历史: * ----------------------------------------------- */ public class DirectorTest { public static void main(String[] args) { Builder pandy = new BisBuilder(); pandy.init("潘永郑", "男", "5226011982"); Director director = new Director(pandy); director.construct(); System.out.println(pandy.getResult().toString()); Builder marks = new BisBuilder(); marks.init("张无忌", "阴阳人", "5226011900"); director = new Director(marks); director.construct(); System.out.println(marks.getResult().toString()); } } |