美文网首页
大话设计模式-建造者模式-2020-10-14

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

作者: 勇往直前888 | 来源:发表于2020-10-15 11:00 被阅读0次

定义

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

结构图

image.png
  • director:指挥者。由指挥者根据需求决定调用哪个建造者生产哪种产品。

  • builder:建造者接口。定义了建造一个产品所必须的所有流程。所有的建造者都需要实现该类,以确保实现建造一个产品所需的流程。

  • concreteBuilder:具体建造者。每一个建造者,可以创建一种产品,产品细节在建造者中定义,因此多个产品对应多个建造者。

  • product:具体产品。

使用场景

  • 主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。

  • 建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。

  • 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适应的模式。

画小人的例子

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

  • 结构图
image.png

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

  • 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;
    }
}
  • PersonBuilder类(Builder):定义各个制造过程,获取产品等方法。可以是抽象基类,也可以是接口
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;
    }
}
  • PersonThinBuilder、PersonFatBuilder类(ConcreteBuilder):具体的制造类,这里需要定义具体的建造细节。
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("胖子的右脚");
    }
}
  • PersonDirector类(Director):指挥者,将各个建造步骤组合成固定的建造流程,并调用具体的建造者完成产品建造。
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

相关文章

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

    定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构图 director:指挥者...

  • 设计模式之建造者模式

    建造者模式 为什么使用及建造者模式 就以《大话设计模式》中的案例来说吧,中国人做饭,同一个鱼香肉丝,不同的厨师做出...

  • 大话设计模式之建造者模式

    建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;...

  • Retrofit

    Retrofit设计模式 动态代理,装饰模式,建造者模式,抽象工厂模式,适配器模式 建造者模式创建Retrofit...

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 1. 模式定义 建造者模式又可以成为生成器模式,它属于对象创建型模式。建造者模式将一个复杂对...

  • java设计模式--建造者模式

    java设计模式--建造者模式 建造者模式定义 建造者模式:是将复杂对象的构建与表示进行分离,使同样的构建过程会有...

  • 【Java设计模式】--建造者模式

    建造者模式(Bulider模式) 一、什么是建造者模式 建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示...

网友评论

      本文标题:大话设计模式-建造者模式-2020-10-14

      本文链接:https://www.haomeiwen.com/subject/yzpwpktx.html