《JAVA与模式》之建造者模式
1.概念
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]
与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。
消费者最后是通过建造者得到产品而不是通过指导者,另外,消费者无法直接让建造者建造产品,这个可能是建造者跟工厂方法的最大区别
工厂方法是需求者可以直接接触到工厂对象,然后指派其生产。
建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
工厂方法角色
1.抽象产品
2.具体产品
3.抽象建造者
4.具体建造者
5.指挥者
消费者通过指挥者调动具体的建造者,生产具体产品
举个例子,我要装修房子,我请了一批工人,但是我不是搞设计的,所以我又请了装修公司的人(指挥者),让他们负责调度
工人(建造者),而这些工人是我介绍给指挥者的,最后通过工人的努力,得到我想要的效果(产品),这个产品是工人给你的,而不是设计师
设计师只负责设计,指挥工人而已
先看一个简单的实例
1 interface Product{ 2 3 public void part1(); 4 public void part2(); 5 public void part3(); 6 7 } 8 class ProductOne implements Product{ 9 10 public void part1() { 11 System.out.println("ProductOne part1"); 12 } 13 public void part2() { 14 System.out.println("ProductOne part2"); 15 } 16 public void part3() { 17 System.out.println("ProductOne part3"); 18 } 19 } 20 class ProductTwo implements Product{ 21 22 public void part1() { 23 System.out.println("ProductTwo part1"); 24 } 25 public void part2() { 26 System.out.println("ProductTwo part2"); 27 } 28 public void part3() { 29 System.out.println("ProductTwo part3"); 30 } 31 } 32 interface AbstractBuilder{ 33 34 //获得建造好的产品 35 public Product getProduct(); 36 //创建产品 好拗口 因为是生产产品 工厂模式????? 37 public void buildProduct(); 38 } 39 40 class ProductTwoBuilder implements AbstractBuilder{ 41 private Product product=new ProductTwo(); 42 43 public void buildProduct() { 44 product.part1(); 45 //product.part2();//不是所有的步骤都需要的 46 product.part3(); 47 } 48 public Product getProduct() { 49 System.out.println("ProductTwo 生产完毕"); 50 return this.product; 51 } 52 } 53 class ProductOneBuilder implements AbstractBuilder{ 54 private Product product=new ProductOne(); 55 public void buildProduct() { 56 product.part2(); 57 product.part3(); 58 } 59 public Product getProduct() { 60 System.out.println("ProductOne 生产完毕"); 61 return this.product; 62 } 63 } 64 //指挥者 等同于抽象工厂中的 具体工厂 65 class Director { 66 private AbstractBuilder builder; 67 public Director(AbstractBuilder builder){ 68 69 this.builder=builder; 70 } 71 public void construct(){ 72 73 builder.buildProduct(); 74 } 75 76 }
参考地址:
http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html
http://haolloyin.blog.51cto.com/1177454/333155
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
· Pascal 架构 GPU 在 vllm下的模型推理优化
· 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!
· 2000 Star,是时候为我的开源项目更新下功能了
· [WPF UI] 为 AvalonDock 制作一套 Fluent UI 主题
· 基于.NET WinForm开发的一款硬件及协议通讯工具
· .NET周刊【12月第2期 2024-12-08】