面向对象的设计模式(二),Builder模式
2015-12-27 21:29
483 查看
前言
Builder(构造者)模式也是一种常用的设计模式,它是用来一步一步构建复杂事物而设计的模式,使用这种模式可以使得复杂事物的构建与展示相分离,具有降低耦合,向外部隐藏复杂事物的构建过程等优点。Builder模式的使用场景:
(1)相同的方法,不同的执行顺序,产生不同的结果;
(2)多个部件或零件,属性都可以装配到一个对象中,但是产生的运行又不相同;
(3)产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候用Builder模式非常合适;
(4)当初始化一个对象特别复杂,如:参数属性多,且很多参数都有默认值。
Builder模式的实现
以生产汽车为例展示Builder模式的过程。我们知道汽车有很多零件,什么方向盘,发动机,轮子等等,同时它还有一个属性,如:名称,价格,级别等。这些都要汽车生产商来完成,那么汽车生产商就是Builder。汽车生产好了以后要投入市场出售,这时汽车会在汽车商城展示。1、汽车 –>要构建的复杂的事物
[code] public class Car { private String name; // 名称:宝马,奔驰,奥迪... private String price; // 价格,3万,10万... private String grade; // 级别,小型车,中型车,大型车 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + ", grade=" + grade + "]"; } }
这里只为了展示Builder模式,所以不涉及零件或者属性等具体的实现。
2、汽车生产商–>CarBuilder.java
[code] public class CarBuilder { private String name; private String price; private String grade; /** * 构造名称 */ public CarBuilder buildName(String name){ this.name = name; return this; } /** * 构造价格 */ public CarBuilder buildPrice(String price){ this.price = price; return this; } /** * 构造级别 */ public CarBuilder buildGrade(String grade){ this.grade = grade; return this; } /** * 生产汽车 */ public Car create(){ Car car= new Car(); car.setName(name); car.setPrice(price); car.setGrade(grade); return car; } }
通常来说,Builder的setter会返回自身this,这样可以实现链表式操作,这里的CarBuilder代表汽车生产商,模拟汽车的生产过程。
3、汽车商城(展示汽车)–>CarShow.java
[code]public class CarShow { private CarBuilder builder; public CarShow(CarBuilder builder){ this.builder = builder; } public Car getCar(){ return builder.create(); } }
这一步有时候也往往会省略,即只有Builder,这只实现汽车的一个展示的过程,客户也可以直接去汽车生产商那买汽车,不用去汽车商城买汽车。
4、客户挑选汽车–>Test.java
[code] public class Test { public static void main(String[] args) { CarBuilder builder = new CarBuilder(); builder.buildName("宝马"); builder.buildPrice("100万"); builder.buildGrade("小型车"); Car car = builder.create(); System.out.println(new CarShow(builder).getCar()); } }
结果:
即:客户实际看到的汽车是100万的小型车宝马
总结:上面的这些就是Builder的过程,通常就是两步,即:构建和展示。有时候会省略展示的过程,直接由构建者Builder完成构建和展示。上面的例子不是为了初始化一个Car对象而是为了通过这种模式模拟实现汽车的构造和展示相分离。如果我们将Builder设置成一个接口或者抽象类,那么传入不同的Buidler就可以得到不同的汽车,这样一来这种模式的灵活性和可扩展性就大大提高了,而且耦合性非常低。
相关文章推荐
- UITableviewCell 重用内存
- 字符串中统计单词个数
- C#中三层架构UI、BLL、DAL、Model实际操作
- zoj 3820 Building Fire Stations(树上乱搞)
- StringBuilder使用小结
- 系统零件
- UITextField属性大全
- EasyUI+Ajax+Json+一般处理程序实现数据的前台与后台的交互
- 152,UIView的常用属性
- UIPickerView
- 【IOS学习笔记】为UICollectionView设置自适应屏幕宽度以及点击效果
- UICollectionView \ UICollectionViewController
- Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)
- WPF,布局,Menu,MenuItem,DockPanel,Grid,DockPanel.Dock='',ToolBar,Content,Image,Uri
- Android GUI 之编辑框(EditText)与监视器
- GUI(概述和布局)
- 34.UIImage — 把多张图片合成一张图
- ios uicollectionview
- 33.使用UIGraphicsGetCurrentContext()重绘图像
- 32.利用UIViewAnimation动画制作一个简单的下拉菜单