建造者模式

来源:互联网 发布:安卓锁屏软件 编辑:程序博客网 时间:2024/06/03 15:17

序言

一个人如果活到了老死, 那么这个人的一生不定会经历这几个阶段:生、老、病、死。每个人的各个阶段都是不一样的, 没有两个人的一生的经历是一样的。 这个特例就是一个简单的建造者模式的叙述。   或许有的人还是不懂什么建造者模式, 那么请你继续向下面看看嘛


建造者模式实际上是常用的设计模式。顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房。楼房是千差万别的,楼房的外形、层数、内部房间的数量、房间的装饰等等都不一样,但是对于建造者来说,抽象出来的建筑流程是确定的,往往建筑一座楼房包括下面的步骤:(1)打桩,建立基础(2)建立框架等。建造者模式的本质和建造楼房是一致的:即流程不变,但每个流程实现的具体细节则是经常变化的。建造者模式的好处就是保证了流程不会变化,流程即不会增加、也不会遗漏或者产生流程次序错误,这是非常重要的。我们熟知的楼歪歪事件,官方的解释就是由于先建立楼房后,再建设停车场造成的,这是典型的建造次序错乱。(看来这些人儿不知道建造者模式啊!!!)


我生活的地方有一个菜叫“锅包肉”。基本每个餐馆都有,但是每个餐馆的味道都不一样,原因是什么呢?因为这道菜的作法没有形成标准呗!每个人的作法都不一样,所以味道就不一样了。这实际上通过“建造者模式”让每个馆子的“锅包肉”都一样。同样的KFC做出来的东西,不论是全国哪家店做出来就都一个味,因为KFC内部有很严格的规定,做巨无霸有做巨无霸的流程,必须严格遵守,这样做出来的东西当然一致了。KFC就是采用了建造者模式!


一、建造者模式

(1). builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

(2). ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

(3). Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

(4). Product:要创建的复杂对象。

1、我的理解

所谓的建造模式:在Director的指挥下, ConcreteBuilder建立一个或者多个完整的复杂产品类对象,返回给我们的用户


2、建造者模式的抽象图


3、试验模型

Director类:他可以指挥具体建造者(ConcreteBuilder)建造复杂产品

Builder:具体建造者的抽象父类(或者接口), 具体建造者继承于他建造产品

ConcreteBuilder:具体建造者建造具体产品

Product:被具体建造者建造的复杂产品类

代码如下:

Builder.java

package BuilderPattern;public abstract class Builder {public abstract void setPart(String arg1, String arg2);      public abstract Product getProduct();  }
ConcreteBuilder.java
package BuilderPattern;public class ConcreteBuilder extends Builder {private Product product = new Product();          public Product getProduct() {          return product;      }        public void setPart(String arg1, String arg2) {          product.setName(arg1);          product.setType(arg2);      }  }

Product.java

package BuilderPattern;public class Product {      private String name;      private String type;      public void showProduct(){          System.out.println("名称:"+name);          System.out.println("型号:"+type);      }      public void setName(String name) {          this.name = name;      }      public void setType(String type) {          this.type = type;      }  } 

Director.java

指挥者通过抽象建造者编程, 客户端只需要知道具体建造者类型, 就可以通过指挥类调用建造者的相关方法制造出对应的完成的复杂对象产品

package BuilderPattern;public class Director {      private Builder builder = new ConcreteBuilder();      public Product constructAndGetAProduct(){          builder.setPart("宝马汽车","X7");          return builder.getProduct();      }      public Product constructAndGetBProduct(){          builder.setPart("奥迪汽车","Q5");          return builder.getProduct();      }  }
Client.java

package BuilderPattern;public class Client {public static void main(String[] args){          Director director = new Director();          Product product1 = director.constructAndGetAProduct();          product1.showProduct();            Product product2 = director.constructAndGetBProduct();          product2.showProduct();      }  }

运行结果:

            名称:宝马汽车
            型号:X7
            名称:奥迪汽车
            型号:Q5


二、总结

优点:

1、把复杂类的产品创建布置, 分解到不同的方法中去, 我们能够更加精确的控制生产过程。

2、各个具体建造者之间相互独立存在, 我们可以根据建造者的不用创建不同的复杂茶产品类对象。

3、增加新的具体建造者不用修改类库的代码, 符合“开闭原则”

缺点:

1、如果产品类之间的属性差异过大,那么就不易使用建造者模式

适用环境:

1、适用于相似类产品的构造

2、适用于对象有多个成员属性的情况

原创粉丝点击