虫虫的技术博客 技术 生活

Tuesday, May 21, 2019

设计模式-建造者模式

        建造者模式,又叫构建者模式,构建器模式等等,定义这里我就不赘述了,网上书上都很多,可以很方便找来看。我为什么不说一遍呢,第一,觉得大部分的定义都描述的不是很易懂,第二,我自己目前还没达到能够下定义的水平。
        先来看看代码,然后再给出我的理解。

public class Article {
    private String title;
    private String content;
    private String sign;
    private Date time;
//省略了getter,setter,toString

}

public interface ArticleBuilder {
    void setTitle(String title);
    void buildContent(String title);
    void setTime(Date date);
    Article getResultArticle();
}

public class ConcreteArticleBuilder implements ArticleBuilder {
    private Article article = new Article();
    @Override
    public void setTitle(String title) {
        article.setTitle(title);
    }

    @Override
    public void buildContent(String content) {
        article.setContent(content);
    }

    @Override
    public void setTime(Date date) {
        article.setTime(date);
    }

    @Override
    public Article getResultArticle() {
        return article;
    }
}

public class ArticleWriter {

    private ArticleBuilder builder;
    public ArticleWriter(ArticleBuilder builder) {
        this.builder = builder;
    }

    public Article construct() {
        builder.setTitle("");
        builder.buildContent("");
        builder.setTime(new Date());
        return builder.getResultArticle();
    }
}

public class BuilderPatternDemo {
    public static void main(String[] args) {
        ArticleBuilder carBuilder = new ConcreteArticleBuilder();
        ArticleWriter cd = new ArticleWriter(carBuilder);
        Article car = cd.construct();
        System.out.println(car);
    }
}



建造者模式的核心类是Builder接口和具体的Builder实现类,比如StringBuilder,我们在使用的过程中,几乎忽略了Director角色和抽象Builder(Appendable)的存在,而Director角色也通常是业务逻辑中的角色,对于抽象程度不高的业务代码中,没有什么影响。对于一个架构良好的设计中,各角色的存在还是很有必要的。

建造者模式和工厂模式的区别在于,工厂模式使用类似于流水线的方式目的在于生产一批对象,而建造者模式核心的关注点是如何创建一个对象,以及创建过程中的每个细节。工厂模式的适用于批量创建多个对象的场景,建造者模式适用创建单个复杂的不同对象,用建造者创建的多个对象之间的差异较大。
再用另外一个比喻,一个是工厂,生产出来的是千篇一律的产品,另外一个是指挥家,创造的音乐是有个性的,几乎是唯一的音乐。
再比如,创作一幅画,这个也可以用建造者模式

建造者模式在JDK中身影:StringBuilder

下面再附上实现《设计模式》中的Builder模式的代码:

0 comments:

Post a Comment

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com