概念:
建造者模式:将一个结构的建造和它的表示分离,使得同样的建造过程可以创建不同的表示。
实现:
定义书籍接口:
public abstract class Book { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
书籍类别:(小说类书籍、工具类书籍...)
public class NovelBook extends Book { private String plot; public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } }
public class ToolBook extends Book { private String purpose; public String getPurpose() { return purpose; } public void setPurpose(String purpose) { this.purpose = purpose; } }
定义创建者接口:
public interface BookBuilder { /** * 设置书的id * @param id */ void setBookId(Integer id); /** * 设置书的名称 * @param name */ void setBookName(String name); Book createBook(); }
创建者类别:
public class NovelBookBuilder implements BookBuilder { NovelBook book = new NovelBook(); @Override public void setBookId(Integer id) { book.setId(id); } @Override public void setBookName(String name) { book.setName(name); } @Override public Book createBook() { return book; } public void setBookPlot(String plot){ book.setPlot(plot); } }
public class ToolBookBuilder implements BookBuilder { ToolBook book = new ToolBook(); @Override public void setBookId(Integer id) { book.setId(id); } @Override public void setBookName(String name) { book.setName(name); } @Override public Book createBook() { return book; } public void setPurpose(String purpose) { book.setPurpose(purpose); } }
分析:通过代码可以简单的分析一下,有没有一种很熟悉的感觉,但又好像觉得不一样,这就对了,设计模式中很多都是这样的感觉,但仔细体会,会有很奇妙的发现,就是有不一样的地放
1.容易扩展,但不具备普遍性,也就是可以很方便的增加新的类型和对应的建造者,但是还是在一定数量内,不具有一般普遍性,这个主要取决于被创造的对象是否高度统一。
2.封装型比较好,外部不用知道内部具体什么操作,只关心具体对象的使用即可。
3.可以和单例或者工厂方法组合。
4.适用场景:
a.在调用相同方法,因为顺序不同而导致结果不同时可以考虑。
b.在构建特别复杂类型时,比如,Book中有一个Author(作者)类型等,或是还需要Cover(封面)类型,甚至多个类型组合。并且这些属性只要在用的前一刻复制就可以,并不影响其他地方使用。
...
经典框架中使用的:
Spring框架,Httpclient中对Cookie容器的设计