建造者模式详解
来源:互联网 发布:2016年免费的顶级域名 编辑:程序博客网 时间:2024/06/05 02:23
定义
讲一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示
模式结构
- Builder:抽象建造者
- ConcreteBuilder:具体建造者
- Director:指挥者
- Product:产品角色
建造者模式优点:
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,相同的建造过程可以创建不同的产品对象
- 使用的不同的具体建造者就可以得到不同的产品对象,具体建造者之间相互独立
- 可以更加惊喜的控制产品的创建过程
- 增加新的具体建造者无需修改原有的类库代码,指挥者类针对抽象建造者类编程,符合“开闭原则”
建造者模式与抽象工厂模式区别
- 建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品。
- 如果抽象工厂模式是汽车配件生产工厂,那建造者模式就是汽车组装工厂。
示例
某软件公司欲开发一个音频与视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等;在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。现要求使用建造者设计模式设计该软件。
uml类图
代码
VedioPlayer:
public class VedioPlayer { private String menu; private String playlist; private String mainwindow; private String controlbar; private String collect; //get和set方法}
PlayerBuilder:
public abstract class PlayerBuilder { protected VedioPlayer vedioPlayer; public PlayerBuilder(){ vedioPlayer = new VedioPlayer(); } public abstract void buildMenu(); public abstract void buildPlaylist(); public abstract void buildMainwindow(); public abstract void buildControlbar(); public abstract void buildCollect(); public VedioPlayer getVedioPlayer(){ return vedioPlayer; }}
FullModeBuilder:
public class FullModeBuilder extends PlayerBuilder { @Override public void buildMenu() { System.out.println("显示菜单"); vedioPlayer.setMenu("显示菜单"); } @Override public void buildPlaylist() { System.out.println("显示列表"); vedioPlayer.setPlaylist("显示列表"); } @Override public void buildMainwindow() { System.out.println("显示主窗口"); vedioPlayer.setMainwindow("显示主窗口"); } @Override public void buildControlbar() { System.out.println("显示控制条"); vedioPlayer.setControlbar("显示控制条"); } @Override public void buildCollect() { }}
SimpleModeBuilder:
public class SimpleModeBuilder extends PlayerBuilder { @Override public void buildMenu() { } @Override public void buildPlaylist() { } @Override public void buildMainwindow() { System.out.println("显示主窗口"); vedioPlayer.setMainwindow("显示主窗口"); } @Override public void buildControlbar() { System.out.println("显示控制条"); vedioPlayer.setControlbar("显示控制条"); } @Override public void buildCollect() { }}
MemoryModeBuilder
public class MemoryModeBuilder extends PlayerBuilder { @Override public void buildMenu() { } @Override public void buildPlaylist() { } @Override public void buildMainwindow() { System.out.println("显示主窗口"); vedioPlayer.setMainwindow("显示主窗口"); } @Override public void buildControlbar() { System.out.println("显示控制条"); vedioPlayer.setControlbar("显示控制条"); } @Override public void buildCollect() { System.out.println("显示收藏夹"); vedioPlayer.setCollect("显示收藏夹"); }}
PlayerDirector
public class PlayerDirector { private PlayerBuilder builder; public VedioPlayer construct(){ builder.buildMenu(); builder.buildPlaylist(); builder.buildMainwindow(); builder.buildControlbar(); builder.buildCollect(); return builder.vedioPlayer; } public void setBuilder(PlayerBuilder builder){ this.builder = builder; }}
public static void main(String[] args) { PlayerBuilder builder; PlayerDirector director = new PlayerDirector(); builder = new FullModeBuilder(); director.setBuilder(builder); director.construct(); }
结果:
模式分析
- 抽象建造者类定义了产品的创建方法和返回方法
- 建造者模式引入指挥者类Director,一方面隔离了客户与生产的过程;一方面它负责控制产品的生成过程。
- 客户端中只需要确定具体的建造者类型。
适用环境
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
阅读全文
0 0
- 建造者模式 详解
- 建造者模式详解
- 详解之建造者模式
- java 建造者模式详解
- 设计模式详解之建造者模式
- 【设计模式】建造者模式详解
- 设计模式-建造者模式详解
- Java与模式之建造者模式详解
- 详解设计模式——建造者模式
- (十五)建造者模式详解(都市异能版)
- (十五)建造者模式详解(都市异能版)
- (十五)建造者模式详解(都市异能版)
- (十五)建造者模式详解(都市异能版)
- Builder 建造者模式
- 建造者模式
- 设计模式-------建造者
- 建造者模式
- 建造者模式(Builder)
- 2426: [HAOI2010]工厂选址 贪心
- Java多线程复习与巩固(二)--线程相关工具类的使用
- 智能输入法的实现
- 设计模式—享元模式(二十二)
- 抽屉式布局DrawerLayout的实现
- 建造者模式详解
- TensorFlow教程02:MNIST实验——Softmax回归
- iOS App Performance: Instruments & beyond
- Quartz中时间表达式的设置-----corn表达式
- Hadoop/Spark相关面试问题总结
- VS2010创建项目后各文件后缀名的意义
- caffe+报错︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
- Thinking in java-5 Java中对象存在的意义
- 命令窗口下:Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法