23种经典设计模式的java实现之生成器模式

23种经典设计模式的java实现之生成器模式 在这里我们使用一个构建房屋的场景来说明“生成器”——builder模式的使用。 这个模式的定义是: 1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2、当构造过程必须允许被构造的对象有不同的表示时。 简单的说,它有点像工厂模式,但是最终生成“产品”的是Director而非Factory,Director可以使用的builder来生成产品。而builder——生成器则遵循统一的接口,实现不同的内容,从而达到将一个复杂对象的构建与它的表示分离的目标。 下面看这个实际的例子吧: 首先,这是我们最终需要生成的产品——房屋,它具有房间数量和门数量的属性。 package com.alex.designpattern.builder; /** * 最终我们需要的产品——房屋 * * @author huqi * @serialData 2007 */ public class House { int roomNumber; int doorNumber; public House() { roomNumber = 0; doorNumber = 0; } public int getRoomNumber() { return roomNumber; } public int getDoorNumber() { return doorNumber; } } 下面就是房屋的真正构建者——“生成器”的接口定义,以及它的一个实现。 package com.alex.designpattern.builder; /** * 房屋构建者的接口 * * @author huqi * @serialData 2007 */ public interface HouseBuilder { public void BuildRoom(int roomNo); public void BuildDoor(int room1, int room2); public House getHouse(); } package com.alex.designpattern.builder; public class ConcreteHouseBuilderA implements HouseBuilder { private House house; public ConcreteHouseBuilderA() { house = new House(); } public void BuildRoom(int roomNo) { // you can create a new Room added to a House house.roomNumber = house.roomNumber + roomNo; } public void BuildDoor(int room1, int room2) { // you can create a new door assotiated with 2 room // and added this door into a house house.doorNumber = house.doorNumber + room1 + room2; } public House getHouse() { return house; } } 那么,这就是所谓的Director——最终构建房屋的“表示者”。我们需要给它提供“生成器”,然后由它来构建房屋。 package com.alex.designpattern.builder; /** * 房屋(构建)的“表示”者,通过它我们可以对同一种构建采用不同的表示方式 * * @author huqi * @serialData 2007 */ public class HouseDirector { public static House CreateHouse(HouseBuilder concreteBuilder) { concreteBuilder.BuildRoom(1); concreteBuilder.BuildRoom(2); concreteBuilder.BuildDoor(1, 2); concreteBuilder.BuildDoor(2, 1); return concreteBuilder.getHouse(); } } 最后,当然是我们的测试启动类了,可以看到,使用生成器模式的简单过程就是: 1、创建生成器对象。 2、表示者使用此生成器对象构建最终产品。 package com.alex.designpattern.builder; /** * A test client to create a house
* but we do not know how the room and door be created *

* * Builder(生成器模式) *

* 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 */ public class Test { public static void main(String[] args) { ConcreteHouseBuilderA myHouseBuilder = new ConcreteHouseBuilderA(); House myHouse = HouseDirector.CreateHouse(myHouseBuilder); System.out.println("My house has room: " + myHouse.getRoomNumber()); System.out.println("My house has door: " + myHouse.getDoorNumber()); } } 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要。刚才google到一篇文章,总算清楚了。在这里转贴一下这位richardluo的比喻。 简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了! 以下是richardluo的代码,我根据他的思路加上了相应的注释。 1,定义工人接口,就是能够完成建造房子任务的人的通用要求。 java 代码 // 工人接口,定义了各个工人所要进行的工所作。他们负责进行具体部件如窗户,地板的建造。 // 同时因为房子是民工建的,因此建设完成后由他把房子递交回房主 public interface Builder { public void makeWindow(); public void makeFloor(); public Room getRoom(); } 2,定义设计师,他的职责是指挥房主指派给他的工人按照自己的设计意图建造房子。 java 代码 // 设计师。他知道房子应该怎么设计,但他不会自己去建造,而是指挥民工去建造。 public class Designer { // 指挥民工进行工作 public void order(Builder builder) { builder.makeWindow(); builder.makeFloor(); } } 3,民工,他负责具体事物的实施。 java 代码 // 民工。负责进行具体部件如窗户,地板的建造。 //同时因为房子是民工建的,因此建设完成后由他把房子递交回房主 public class Mingong implements Builder { private String window=""; private String floor=""; public void makeWindow() { window=new String("window"); } public void makeFloor(){ floor=new String("floor"); } // 回交房子给房主 public Room getRoom() { if((!window.equals(""))&&(!floor.equals(""))) { System.out.println("room ready!"); return new Room(); } else return null; } } 4,房主,就是雇人,收房。 java 代码 // 房主。房主的任务就是聘请一个民工,一个设计师,同时把民工给设计师指挥,督促设计师开展工作。最后从民工手上收房。 public class Client { public static void main(String[] args) { Builder mingong = new Mingong(); Designer designer = new Designer(); designer.order(mingong); mingong.getRoom(); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值