Builder设计模式

来源:互联网 发布:mac怎么免费下载软件 编辑:程序博客网 时间:2024/06/14 23:37

一.用途

1.为了把构建过程跟表示形式分离出来(说白了,动物生孩子,龙生龙凤生凤,老鼠的儿子XXX,过程都一样,但是最后生出来的不一样),所以可以把这个过程抽出去,因为大家都一样嘛


二.使用场景

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同表示时。


三.举个栗子

(1)

女娲造人的例子,显示早了一堆模子(Builder)(参考做冰棒的模子),然后每个模子都放泥巴做成老鼠,人,龙的样子(这样就是ConcreteBuilder),然后最后得出的老鼠,人,龙(就是Product),然后整个填充模子的人是女娲(Director),她决定先是做手还是做头。

1、Builder:为创建一个产品对象的各个部件指定抽象接口。
2、ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
3、Director:构造一个使用Builder接口的对象,指导构建过程。
4、Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

Builder:
/** * Created by Administrator on 2016/9/17 0017. * 角色Builder(上帝造动物的模子):创建一个东西的必经的各个过程, */public interface AnimalBuilder {    void buildHead();    void buildBody();    void buildFoot();    Animal buildAnimal();}

ConcreteBuilder:
//MouseBuilder.java
/** * Created by Administrator on 2016/9/17 0017. * concreteBuilder(往模子里面填充具体的东西): 实现Builder,也就是具体明确那些步骤做些什么 */public class MouseBuilder implements AnimalBuilder {    Animal mouse;    public MouseBuilder() {        mouse = new Animal();    }    @Override    public void buildHead() {        mouse.setHead("老鼠的头");    }    @Override    public void buildBody() {        mouse.setBody("老鼠的身体");    }    @Override    public void buildFoot() {        mouse.setBody("老鼠的脚");    }    @Override    public Animal buildAnimal() {        return mouse;    }}

//PersonBuilder.java
/** * Created by Administrator on 2016/9/17 0017. * concreteBuilder(往模子里面填充具体的东西): 实现Builder,也就是具体明确那些步骤做些什么 */public class PersonBuilder implements AnimalBuilder {    Animal person;    public PersonBuilder() {        person = new Animal();    }    @Override    public void buildHead() {        person.setHead("人的头");    }    @Override    public void buildBody() {        person.setBody("人的身体");    }    @Override    public void buildFoot() {        person.setFoot("人的脚");    }    @Override    public Animal buildAnimal() {        return person;    }}


//DragonBuilder.java
/** * Created by Administrator on 2016/9/17 0017. * concreteBuilder(往模子里面填充具体的东西): 实现Builder,也就是具体明确那些步骤做些什么 */public class DragonBuilder implements  AnimalBuilder {    Animal dragon;    public DragonBuilder() {        dragon = new Animal();    }    @Override    public void buildHead() {        dragon.setHead("龙头");    }    @Override    public void buildBody() {        dragon.setBody("龙体");    }    @Override    public void buildFoot() {        dragon.setFoot("龙腿");    }    @Override    public Animal buildAnimal() {        return dragon;    }}

Director

/** * Created by Administrator on 2016/9/17 0017. * Director 指导构建过程(也就是构建的步骤顺序或者用哪些步骤)可以认为这就是上帝了 */public class AnimalDirector {    public Animal constructAnimal(AnimalBuilder ab){        ab.buildHead();        ab.buildBody();        ab.buildFoot();        return ab.buildAnimal();    }}


Product
/** * Created by Administrator on 2016/9/17 0017. * 角色Product:上帝创造出的动物 */public class Animal {    private String head;    private String body;    private String foot;    public String getHead() {        return head;    }    public void setHead(String head) {        this.head = head;    }    public String getBody() {        return body;    }    public void setBody(String body) {        this.body = body;    }    public String getFoot() {        return foot;    }    public void setFoot(String foot) {        this.foot = foot;    }    @Override    public String toString() {        return "Animal{" +                "head='" + head + '\'' +                ", body='" + body + '\'' +                ", foot='" + foot + '\'' +                '}';    }}

MainActivity.java
protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        AnimalDirector ab = new AnimalDirector();        Animal person = ab.constructAnimal(new PersonBuilder());        Animal mouse = ab.constructAnimal(new MouseBuilder());        Animal dragon = ab.constructAnimal(new DragonBuilder());        System.out.println("xcqw person"+person.toString());        System.out.println("xcqw mouse"+mouse.toString());        System.out.println("xcqw dragon"+dragon.toString());    }



结果:
 xcqw personAnimal{head='人的头', body='人的身体', foot='人的脚'}
xcqw mouseAnimal{head='老鼠的头', body='老鼠的脚', foot='null'}
xcqw dragonAnimal{head='龙头', body='龙体', foot='龙腿'}


(2)

建造者模式在使用过程中可以演化出多种形式:
如果具体的被建造对象只有一个的话,可以省略抽象的Builder和Director,让ConcreteBuilder自己扮演指导者和建造者双重角色,甚至ConcreteBuilder也可以放到Product里面实现。
在《Effective Java》书中第二条,就提到“遇到多个构造器参数时要考虑用构建器”,其实这里的构建器就属于建造者模式,只是里面把四个角色都放到具体产品里面了。

/** * Created by Administrator on 2016/9/17 0017. */public class DogBulder {    Animal animal;    public DogBulder() {        animal = new Animal();    }    public void buildHead() {        animal.setHead("狗脑袋");    }    public void buildBody() {        animal.setBody("狗身体");    }    public void buildFoot() {        animal.setHead("狗脚");    }    public Animal builderDog() {        buildHead();        buildBody();        buildFoot();        return animal;    }}

0 0
原创粉丝点击