Android设计模式之建造者设计模式

来源:互联网 发布:迪奥旷野香水知乎 编辑:程序博客网 时间:2024/05/21 17:30

建造者设计模式和工厂类设计模式有很多相似的地方,但非常重要的一点:建造者模式注重基本方法的调用顺序安排,而工厂类则侧重于创建对象.

1.关于建造者的几个概念:

①Builder:是一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
②、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
③、Director:导演类,负责安排已有模块的顺序。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
④、Product:产品类。

先上代码:
产品类的抽象类:

package com.dgtech.builder;import java.util.ArrayList;public abstract class Person {    //决定人起床后做各种事情的顺序    public ArrayList<String> sequence = new ArrayList<String>();    //吃饭    public abstract void eat();    //洗脸    public abstract void wash();    //上厕所    public abstract void wc();    //人起床后会按照不同的顺序做不同的事    public void afterGetUp(){        for (int i = 0; i < sequence.size(); i++) {            if("eat".equals(sequence.get(i))){                eat();            }else if("wash".equals(sequence.get(i))){                wash();            }else if("wc".equals(sequence.get(i))){                wc();            }        }    }    public void setSequence(ArrayList<String> sequence){        this.sequence = sequence;    }}

产品类的两个实现类

public class Man extends Person{    @Override    public void eat() {        System.out.println("男人吃米饭");    }    @Override    public void wash() {        System.out.println("男人用肥皂洗脸");    }    @Override    public void wc() {        System.out.println("男人上厕所很快");    }}public class Women extends Person{    @Override    public void eat() {        System.out.println("女人喝牛奶");    }    @Override    public void wash() {        System.out.println("女人用洗面奶洗脸");    }    @Override    public void wc() {        System.out.println("女人上厕所很慢");    }}

准备好了产品类,下面进入builder
builder的抽象类

import java.util.ArrayList;public abstract class Builder {    //按照子类提供的顺序造人    public abstract void setsequence(ArrayList<String> sequence);    //返回一个人    public abstract Person getPerson();}

builder抽象类的两个实现类

import java.util.ArrayList;public class ManBuilder extends Builder{    Man man = new Man();    public void setsequence(ArrayList<String> sequence) {        man.setSequence(sequence);    }    public Person getPerson() {        // TODO Auto-generated method stub        return this.man;    }}import java.util.ArrayList;public class WomenBuilder extends Builder{    Women women = new Women();    public void setsequence(ArrayList<String> sequence) {        women.setSequence(sequence);    }    public Person getPerson() {        // TODO Auto-generated method stub        return this.women;    }}

导演类:

package com.dgtech.builder;import java.util.ArrayList;public class Director {    ManBuilder manBuilder = new ManBuilder();    WomenBuilder womenBuilder = new WomenBuilder();    ArrayList<String> sequence = new ArrayList<String>();    //创建A类型的男人,先吃饭再上厕所最后洗脸    public Man getAMan(){        sequence.clear();        sequence.add("eat");        sequence.add("wc");        sequence.add("wash");        manBuilder.setsequence(sequence);        return (Man) manBuilder.getPerson();    }    //创建B类型的男人,先上厕所再吃饭最后洗脸        public Man getBMan(){            sequence.clear();            sequence.add("wc");            sequence.add("eat");            sequence.add("wash");            manBuilder.setsequence(sequence);            return (Man) manBuilder.getPerson();        }        //当然后面可以创建各种不同类型的男人和女人,这里不再赘述}

client类(用户实现类):

public class Client {    public static void main(String[] args) {        Director director = new Director();        Man aMan = director.getAMan();        aMan.afterGetUp();        Man bMan = director.getBMan();        bMan.afterGetUp();    }}

输出结果:
男人吃米饭
男人上厕所很快
男人用肥皂洗脸

男人上厕所很快
男人吃米饭
男人用肥皂洗脸

记住关键点:不同的方法顺序生产不同的产品,这个是建造者设计模式的核心
一般用在步骤复杂的产品类创建上,比如不同的步骤创建出来的对象不同

0 0
原创粉丝点击