您的位置:首页 > 产品设计 > UI/UE

java设计模式:创建者模式Builder pattern

2015-09-21 22:54 591 查看
创建者模式概念(总结)

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)对产品属性有不同的创建方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: