标签:
构造者模式
先复制粘贴一下构造者模式的定义:
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
构造者有四种角色组成:
Builder:是为创建一个Product对象的各个部件指定的抽象接口
ConcreteBuilder:它是具体的构建者,实现Builder接口,构造和装配各个部件。
Product:具体的产品
Director:指挥者,它是构建一个使用Builder接口的对象。
估计很多同学都没看懂,好啦,那我们先不管那么多的定义,我们先来讲一个故事吧,故事的内容就是一个土财主盖房子的事情。
-------------------------------------------第一阶段——添加product角色(House.java)---------------------
首先有个财主,他叫main,他想盖一座房子,名曰House.java(如下)
package builder01;
public class House {
//地板
private String floor = null;
//墙
private String wall = null;
//屋顶
private String housetop = null;
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 builder01;
public class MainClass {
public static void main(String[] args) {
//客户直接造房子
House house = new House();
house.setFloor("地板");
house.setWall("墙");
house.setHousetop("屋顶");
}
}
-----------第二阶段—添加Builder(HouseBuilder.java)与ConcreteBuilder(BungalowBuilder.java)角色---------------------------------
OK,我们看见整个过程都没问题 ,但是堂堂一个财主,自己去盖房子,貌似有点不太体面,所以这个时候需要一个施工队(HouseBuilder.java),
package builder02;
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHousetop();
public House getHouse();
}
然而HouseBuilder只是个接口,纯粹是个称谓,要盖房子还要找具体的施工队(盖平房的 施工队)
BungalowBuilder.java:
package builder02;
public class BungalowBuilder 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 builder02;
public class MainClass {
public static void main(String[] args) {
//由工程队来修房子
HouseBuilder builder = new BungalowBuilder();
//调用工程队来修
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());
}
}
但是心细的同学可能发现了,虽然财主不用自己造平房了,但是财主需要自己指挥平房施工队来建造房子,这任务依然不轻松……这个时候财主就在想,要是有一个大管家来帮他指挥,那样的话岂不是方便很多!所以下面我们就把这个大管家给请过来:
-------------第四阶段——添加Director(HouseDirector.java)角色-----------
package builder04;
public class HouseDirector {
public void makeHouse(HouseBuilder houseBuilder){
houseBuilder.makeFloor();
houseBuilder.makeHousetop();
houseBuilder.makeWall();
}
}
其他的不变,这个时候财主要建造房子,只需要跟大管家(HouseDirector.java)说一声就可以了,代码如下:
package builder04;
public class MainClass {
//直接在makeHouse中传houseBuilder的值,也是比较规范的
public static void main(String[] args) {
//建造平房
//由工程队来修
HouseBuilder houseBuilder = new BungalowBuilder();
//设计者来做
HouseDirector houseDirector = new HouseDirector();
houseDirector.makeHouse(houseBuilder);
House house = houseBuilder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
OK,到此,财主建造房子的故事算是正式讲完了,其中构造者模式的每一个角色也都比较详细的跟大家介绍清楚了,so,再回头对照着原始的定义,好好地回顾一下吧~
标签:
原文地址:http://www.cnblogs.com/magicy/p/4631788.html