设计模式——建造者模式
来源:互联网 发布:qq飞车神影官网的数据 编辑:程序博客网 时间:2024/04/28 07:13
http://blog.csdn.net/dawanganban/article/details/9990405
什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
首先我们建立一个House对象
- package com.meritit;
- /**
- * 房子
- * @author 李小强
- *
- */
- 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;
- }
- }
如果按照普通方法,我们去这样建造房子
- package com.meritit;
- /**
- *
- * @author 李小强
- *
- */
- public class MainClass {
- public static void main(String[] args) {
- //客户直接造房子
- House house = new House();
- house.setFloor("地板");
- house.setHousetop("屋顶");
- house.setWall("墙");
- }
- }
上面的这种方式实际上是让客户自己造房子,这显然不好,下面我们开始用建造者模式实现:
创建一个HouseBuilder接口
- package com.meritit;
- /**
- * 造房子的接口
- * @author 李小强
- *
- */
- public interface HouseBuilder {
- //修地板
- public void makeFloor();
- //修墙
- public void makeWall();
- //修屋顶
- public void makeHousetop();
- //获得房子
- public House getHouse();
- }
用具体的造房子的工程实现
- package com.meritit;
- /**
- * 平房工程队
- * @author 李小强
- *
- */
- public class PingFangBuilder implements HouseBuilder{
- House house = new House();
- @Override
- public void makeFloor() {
- house.setFloor("平房地板");
- }
- @Override
- public void makeWall() {
- house.setWall("平房房顶");
- }
- @Override
- public void makeHousetop() {
- house.setHousetop("平房屋顶");
- }
- @Override
- public House getHouse() {
- return house;
- }
- }
现在这样造房子
- package com.meritit;
- /**
- *
- * @author 李小强
- *
- */
- public class MainClass {
- public static void main(String[] args) {
- //由工程队来修房子
- HouseBuilder builder = new PingFangBuilder();
- builder.makeFloor();
- builder.makeHousetop();
- builder.makeWall();
- House house = builder.getHouse();
- System.out.println(house.getFloor());
- System.out.println(house.getHousetop());
- System.out.println(house.getWall());
- }
- }
这里好像缺少一个专门建造房子的角色,下面我们这样做:
创建一个实际的建造者去造房子
- package com.meritit;
- /**
- * 实际建造者
- * @author 李小强
- *
- */
- public class HouseDicrector {
- private HouseBuilder builder;
- public HouseDicrector(HouseBuilder builder){
- this.builder = builder;
- }
- /**
- * 建造房子
- */
- public void makeHouse(){
- builder.makeFloor();
- builder.makeHousetop();
- builder.makeWall();
- }
- }
现在Main方法中就可以这样造房子了:
- package com.meritit;
- import javax.naming.directory.DirContext;
- /**
- *
- * @author 李小强
- *
- */
- public class MainClass {
- public static void main(String[] args) {
- //设计房子
- HouseBuilder builder = new PingFangBuilder();
- //创造工程队
- HouseDicrector dicrector = new HouseDicrector(builder);
- //开始造
- dicrector.makeHouse();
- //得到房子
- House house = builder.getHouse();
- System.out.println(house.getFloor());
- System.out.println(house.getHousetop());
- System.out.println(house.getWall());
- }
- }
这就是建造者设计模式,如果现在你想建造公寓只需要先设计一个公寓就行。
设计公寓
- package com.meritit;
- /**
- * 设计公寓
- * @author 李小强
- *
- */
- public class GongyuBuilder implements HouseBuilder{
- House house = new House();
- @Override
- public void makeFloor() {
- house.setFloor("公寓地板");
- }
- @Override
- public void makeWall() {
- house.setWall("公寓墙");
- }
- @Override
- public void makeHousetop() {
- house.setHousetop("公寓房顶");
- }
- @Override
- public House getHouse() {
- return house;
- }
- }
在Main方法中只需将Pingfang平房改为Gongyu
- package com.meritit;
- import javax.naming.directory.DirContext;
- /**
- *
- * @author 李小强
- *
- */
- public class MainClass {
- public static void main(String[] args) {
- //设计房子
- HouseBuilder builder = new GongyuBuilder();
- //创造工程队
- HouseDicrector dicrector = new HouseDicrector(builder);
- //开始造
- dicrector.makeHouse();
- //得到房子
- House house = builder.getHouse();
- System.out.println(house.getFloor());
- System.out.println(house.getHousetop());
- System.out.println(house.getWall());
- }
- }
我们还可以再改一下
- package com.meritit;
- /**
- * 实际建造者
- * @author 李小强
- *
- */
- public class HouseDicrector {
- /**
- * 建造房子
- */
- public void makeHouse(HouseBuilder builder){
- builder.makeFloor();
- builder.makeHousetop();
- builder.makeWall();
- }
- }
这样在Main方法中可以这样做:
- package com.meritit;
- import javax.naming.directory.DirContext;
- /**
- *
- * @author 李小强
- *
- */
- public class MainClass {
- public static void main(String[] args) {
- //设计房子
- HouseBuilder builder = new GongyuBuilder();
- //创造工程队
- HouseDicrector dicrector = new HouseDicrector();
- //开始造
- dicrector.makeHouse(builder);
- //得到房子
- House house = builder.getHouse();
- System.out.println(house.getFloor());
- System.out.println(house.getHousetop());
- System.out.println(house.getWall());
- }
- }
建造者模式的结构如图:
建造者模式的应用场景:
-对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
源代码下载:http://download.csdn.net/detail/lxq_xsyu/5956163
0 0
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 建造者模式——设计模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式——建造者模式
- 设计模式—建造者模式
- 设计模式学习—建造者模式
- 电脑上不了网怎么办?
- map、multimap、set、multiset容器
- 自己总结的用到的Mysql的用法
- Linux环境下MySQL5.6源代码数据库安装
- fedora 20 安装与常用设置
- 设计模式——建造者模式
- 九度题目1052:找x
- 除去复制代码中的行号
- [ext4]06 磁盘布局 - 特殊inode
- TCP/IP协议头部结构体(网摘小结)
- 这是cocos3d-x么?学习笔记1
- Cache 替换策略
- Oracle相关知识
- 谈一道Java笔试题