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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值