java设计模式:创建者模式Builder pattern
2015-09-21 22:54
591 查看
创建者模式概念(总结)
1、要创建一个复杂对象,这个对象的创建基本过程固定(Builder接口),但是对象要创建的具体内容又是可以改变的(ConcreteBuilder:公寓房、平房)。
2、但是直接用具体的创建者还是会暴露,对象创建的细节,因此可以引入一个设计者(Director),设计者类中有建造者对象(Builder)的引用,设计者通过调用建造对象中的方法来创建对象。设计者可以用来隐藏复杂对象的创建过程。
3、最后会重新组装改复杂对象,即通过Builder返回创建好的复杂对象。
创建者模式的组成部分
以建造房子为例:
1、House类(Product)
这里如果用户要直接创建House对象的话就会new出该房子对象,然后调用set方法设置该house对象的属性,这样会有两个问题:
①:暴露对象创建的过程;
②:修改很不方便。
2、HouseBuilder(Builder)
3、PingFangBuilder(ConcreteBuilder)
4、main方法中建造对象
5、这样只有以上四种角色的话还是会暴ConcreteBuider的细节,这时可以引入设计者类(Director),它本身包含了一个Builder类
6、如此一来,Main方法就变成了
7、假如你不想修平房,想修公寓了,则只要添加相应的具体的ConcreteBuilder即可
只是如果要修改其它类型的house的话,就只要修改具体Builder的方法即可。
建造者模式的应用场景
1、对象的创建:Builder模式视为对象的创建二设计的模式
2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象;
3、关注对象创建的各个部分的创建过程:不同的工厂(指concreteBuilder)对产品属性有不同的创建方法
1、要创建一个复杂对象,这个对象的创建基本过程固定(Builder接口),但是对象要创建的具体内容又是可以改变的(ConcreteBuilder:公寓房、平房)。
2、但是直接用具体的创建者还是会暴露,对象创建的细节,因此可以引入一个设计者(Director),设计者类中有建造者对象(Builder)的引用,设计者通过调用建造对象中的方法来创建对象。设计者可以用来隐藏复杂对象的创建过程。
3、最后会重新组装改复杂对象,即通过Builder返回创建好的复杂对象。
创建者模式的组成部分
以建造房子为例:
1、House类(Product)
package com.dengqi.builder; public class House { private String floor; private String wall; private String housetop; public String getFloor() { return floor; } public void setFloor(String floor) { this.floor = floor; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getHousetop() { return housetop; } public void setHousetop(String housetop) { this.housetop = housetop; } }
这里如果用户要直接创建House对象的话就会new出该房子对象,然后调用set方法设置该house对象的属性,这样会有两个问题:
①:暴露对象创建的过程;
②:修改很不方便。
2、HouseBuilder(Builder)
public interface HouseBuilder { public void makeFloor(); public void makeWall(); public void makeHousetop(); public House getHouse(); }
3、PingFangBuilder(ConcreteBuilder)
package com.dengqi.builder; public class PingfangBuilder implements HouseBuilder { House house = new House(); @Override public void makeFloor() { // TODO Auto-generated method stub house.setFloor("平房:地板"); } @Override public void makeWall() { // TODO Auto-generated method stub house.setWall("平房:墙"); } @Override public void makeHousetop() { // TODO Auto-generated method stub house.setHousetop("地板"); } @Override public House getHouse() { // TODO Auto-generated method stub return house; } }
4、main方法中建造对象
main(String[] args) { HouseBuilder builder = new PingFangBuilder(); builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); House house = builder.getHouse(); }
5、这样只有以上四种角色的话还是会暴ConcreteBuider的细节,这时可以引入设计者类(Director),它本身包含了一个Builder类
public class HouseDirector { private HouseBuilder =builder; public HouseDirector(HouseBuilder builder) { this.builder = builder } public void makeHouse(Builder builder) { builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); } }
6、如此一来,Main方法就变成了
package com.dengqi.builder; public class MainClass { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub HouseBuilder builder = new PingfangBuilder(); Director director = new Director(builder); director.makeHouse(); House house = builder.getHouse(); System.out.println(house.getFloor()); } }
7、假如你不想修平房,想修公寓了,则只要添加相应的具体的ConcreteBuilder即可
public class GongYuBuilder implements HouseBuilder { House house = new House(); public void makeFloor() { house.setFloor("公寓:地板"); } public void makeWall() { house.setWall("公寓:墙"); } public void make() { house.setFloor("公寓:地板"); } public getHouse() { return house; } }
只是如果要修改其它类型的house的话,就只要修改具体Builder的方法即可。
main(String[] args) { HouseBuilder builder = new GongYuBuilder(); HouseDirector director= newHouseDirector(); House house = director.makeHouse(builder); }
建造者模式的应用场景
1、对象的创建:Builder模式视为对象的创建二设计的模式
2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象;
3、关注对象创建的各个部分的创建过程:不同的工厂(指concreteBuilder)对产品属性有不同的创建方法
相关文章推荐
- Xcode Build Search Paths设置
- 关于 java.toString() ,(String),String.valueOf的区别
- CF 一个不知道题号的题。。 B. ShortestPath Query
- android界面UI的构造方式
- String,StringBuffer与StringBuilder的区别
- UIProgressView[进度条][一般型];UIStepper步数器][事件驱动型]
- require.js的使用
- 导入NGUI插件
- KVC中setValuesForKeysWithDictionary:
- UIView层次管理(放到最上层或放到最下层)
- UIView转UIImage
- 在iOS 8中使用UIAlertController
- MDT 2013 Update 1 re-released (build 8298)发布
- win10提示 磁盘包含不是“PARTITION_BASIC_DATA_GUID"类型的分区
- win10提示 磁盘包含不是“PARTITION_BASIC_DATA_GUID"类型的分区
- CYC-集合视图 UICollectionView的简单使用
- BuildConfig.DEBUG的使用
- [UI基础]day01
- POJ 1679 The Unique MST (次小生成树)
- 蓝懿iOS培训日志17 Jason和Segue