Java设计模式之建造者模式
来源:互联网 发布:2015全球云计算大会 编辑:程序博客网 时间:2024/06/05 02:56
建造者模式
介绍
提起Builder,我们第一时间想到的就是建筑物,高楼大厦。在建造高楼大厦的时候,需要先打地基,搭建建筑框架,然后自下而上地一层一层盖起来。通常,在建造这种具有复杂结构的物体时,很难一气呵成。我们需要首先建造组成这个物体的各个部分,然后分阶段将它们组装起来。而建造者模式(Builder Pattern),顾名思义,正是为建造复杂的对象而存在。
建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实现
在建造者模式中,一共有以下五个角色:
- Builder(建造者)
Builder角色负责定义用于生成实例的接口。 - ConcreteBuilder(当前建造者)
ConcreteBuilder角色是负责实现Builder角色的接口的类。这里定义了在生成实例时实际上被调用的方法。 - Director(导演类)
Director角色负责使用Builder角色的接口来生成实例。它并不依赖于ConcreteBuilder角色。为了确保不论ConcreteBuilder角色是如何被定义的,Director角色都能正常工作,它只调用在Builder角色中被定义的方法。 - Product(产品类)
这是一个具体类而不是抽象类,一般来说会是一个比较复杂的对象,即创建实例的过程比较复杂(步骤多或者步骤顺序有要求等等)。 Client(使用者)
Client是最终使用Builder模式的用户。
下面,我们写一段金拱门制作汉堡套餐的示例程序。建造者
public abstract class Builder { public abstract void buildHamburger(); public abstract void buildDrink(); public abstract void buildRefreshments(); public abstract void getProduct();}
当前建造者
public class ConcreteBuilder extends Builder { private Product product = new Product(); @Override public void buildHamburger() { product.setHamburgerName("巨无霸汉堡x1"); } @Override public void buildDrink() { product.setDrinkName("纯牛奶x1"); } @Override public void buildRefreshments() { product.setRefreshmentName("麦乐鸡x4"); } @Override public void getProduct() { System.out.println("巨无霸套餐:" + product.getHamburgerName() + "+" + product.getRefreshmentName() + "+" + product.getDrinkName()); }}
导演类
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct() { builder.buildHamburger(); builder.buildRefreshments(); builder.buildDrink(); }}
产品类
public class Product { private String hamburgerName; private String refreshmentName; private String drinkName; public String getHamburgerName() { return hamburgerName; } public void setHamburgerName(String hamburgerName) { this.hamburgerName = hamburgerName; } public String getRefreshmentName() { return refreshmentName; } public void setRefreshmentName(String refreshmentName) { this.refreshmentName = refreshmentName; } public String getDrinkName() { return drinkName; } public void setDrinkName(String drinkName) { this.drinkName = drinkName; }}
使用者
public class Client { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); builder.getProduct(); }}
输出结果
巨无霸套餐:巨无霸汉堡x1+麦乐鸡x4+纯牛奶x1
建造者模式总结
优点
1)封装性好。建造者模式将复杂对象的创建依次拆分,并且封装在了各个Builder类内部,外部调用的人只需要正确的调用建造者和导演类就能创建对象,而不用关心内部是如何构建的。
2)易扩展。有新需求时,只需要新建一个新的建造者类就可以实现,不用去修改之前的代码,扩展很方便,也不会对既存的业务逻辑产生影响。缺点
1)使用建造者模式,需要各个产品的创建过程具有很大的相似度,如果产品构建差异过大,则不适合使用建造者模式。
2)和工厂模式一样,产品扩展的越多,具体的建造者类也就越多,一定程度上增加了系统的复杂度。和工厂模式区别
工厂模式将对象的创建过程全部封装在了工厂类里面,而建造者模式的各个建造者类只负责各个组件的创建,最后对象的组装由导演类来完成。
因此,相对于工厂模式来说,建造者模式适用于更复杂对象的创建。
阅读全文
1 0
- java设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- 【Java设计模式】之建造者模式
- java设计模式之建造者模式
- Java--设计模式之建造者模式
- java设计模式之-建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- JAVA设计模式之:建造者模式
- Java设计模式之建造者模式
- Java设计模式之建造者模式
- java设计模式之建造者模式
- Java设计模式之建造者模式
- java设计模式之建造者模式
- Variational Auto-Encoder tutuiral
- 【转】Buffer cache和page cache的区别
- 如何选择 Offer?
- nginx2
- 顺序栈
- Java设计模式之建造者模式
- SpringSecurity———单点登录CAS
- oracle系统表v$session、v$sql字段说明(转)
- 第九周 项目三 利用二叉树遍历思想解决问题(3)
- 无障碍服务(一)
- RxJava2 + Retrofit2 + Mvp + Dagger2框架搭建
- 第十周项目实践1 二叉树算法验证
- VirtualApp技术黑产利用研究报告
- Spark SQL