创建者模式概念(总结)
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)对产品属性有不同的创建方法