大话设计模式-建造者模式-2020-10-14

2020-10-15  本文已影响0人  松哥888

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构图

image.png

使用场景

画小人的例子

这个是炒饭的例子,非常不错,可以看看
《大话设计模式》——建造者模式

image.png

这张图缺少了产品Product本身的依赖项,这里就是Person。只是原文中这个例子的Person(Product)是一幅画,所以没有用类来表示。

class Person {
    private String head = "头";
    private String body = "身体";
    private String armLeft = "左手";
    private String armRight = "右手";
    private String legLeft = "左脚";
    private String legRight = "右脚";

    // set函数
    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setArmLeft(String armLeft) {
        this.armLeft = armLeft;
    }

    public void setArmRight(String armRight) {
        this.armRight = armRight;
    }

    public void setLegLeft(String legLeft) {
        this.legLeft = legLeft;
    }

    public void setLegRight(String legRight) {
        this.legRight = legRight;
    }

    // 展示
    public String show() {
        String info = head + "\n"
                + body + "\n"
                + armLeft + "\n"
                + armRight + "\n"
                + legLeft + "\n"
                + legRight + "\n";
        Log.v("Person", info);
        return info;
    }
}
abstract class PersonBuilder {
    protected Person person = new Person();

    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildArmLeft();
    public abstract void buildArmRight();
    public abstract void buildLegLeft();
    public abstract void buildLegRight();

    public Person getPerson() {
        return person;
    }
}
class PersonThinBuilder extends PersonBuilder {
    @Override
    public void buildHead() {
        person.setHead("瘦子的头");
    }

    @Override
    public void buildBody() {
        person.setBody("瘦子的身体");
    }

    @Override
    public void buildArmLeft() {
        person.setArmLeft("瘦子的左手");
    }

    @Override
    public void buildArmRight() {
        person.setArmRight("瘦子的右手");
    }

    @Override
    public void buildLegLeft() {
        person.setLegLeft("瘦子的左脚");
    }

    @Override
    public void buildLegRight() {
        person.setLegRight("瘦子的右脚");
    }
}

class PersonFatBuilder extends PersonBuilder {
    @Override
    public void buildHead() {
        person.setHead("胖子的头");
    }

    @Override
    public void buildBody() {
        person.setBody("胖子的身体");
    }

    @Override
    public void buildArmLeft() {
        person.setArmLeft("胖子的左手");
    }

    @Override
    public void buildArmRight() {
        person.setArmRight("胖子的右手");
    }

    @Override
    public void buildLegLeft() {
        person.setLegLeft("胖子的左脚");
    }

    @Override
    public void buildLegRight() {
        person.setLegRight("胖子的右脚");
    }
}
class PersonDirector {
    public void createPerson(PersonBuilder personBuilder) {
        personBuilder.buildHead();
        personBuilder.buildBody();
        personBuilder.buildArmLeft();
        personBuilder.buildArmRight();
        personBuilder.buildLegLeft();
        personBuilder.buildLegRight();
    }
}
image.png
public class BuilderActivity extends AppCompatActivity {

    public static void launch(Context context) {
        if (null != context) {
            Intent intent = new Intent();
            intent.setClass(context, BuilderActivity.class);
            if (!(context instanceof Activity)) {
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            context.startActivity(intent);
        }
    }

    TextView infoTextView;
    Person thinPerson, fatPerson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_builder);
        setTitle("建造者模式");

        infoTextView = findViewById(R.id.textViewInfo);

        PersonDirector director = new PersonDirector();
        // 画瘦子
        PersonThinBuilder thinBuilder = new PersonThinBuilder();
        director.createPerson(thinBuilder);
        thinPerson = thinBuilder.getPerson();

        // 画胖子
        PersonFatBuilder fatBuilder = new PersonFatBuilder();
        director.createPerson(fatBuilder);
        fatPerson = fatBuilder.getPerson();
    }

    public void onThinClick(View view) {
        infoTextView.setText(thinPerson.show());
    }

    public void onFatClick(View view) {
        infoTextView.setText(fatPerson.show());
    }
}

Demo地址

https://gitee.com/zhangxusong888/Android/tree/master/design_pattern

上一篇 下一篇

猜你喜欢

热点阅读