首页 » SEO优化 » phpbuilder模式技巧_设计模式六 Builder模式

phpbuilder模式技巧_设计模式六 Builder模式

duote123 2024-12-09 0

扫一扫用手机浏览

文章目录 [+]

The builder pattern is a design pattern designed to provide a flexible solution to various object creation problems in object-oriented programming. The intent of the Builder design pattern is to separate the construction of a complex object from its representation. It is one of the Gang of Four design patterns.

普通地表示:即将一个繁芜工具的构建与表示相分离开,同样的构建过程根据须要可以创建不同的表示。
称之为Builder模式或建造者模式。

phpbuilder模式技巧_设计模式六  Builder模式

三、构造组成构造类图:

phpbuilder模式技巧_设计模式六  Builder模式
(图片来自网络侵删)
布局器接口Builder:常日会包含构建部件模块的抽象方法,以及工具创建完成后的结果方法getResult()。
布局用具体实现类ConcreteBuilder:对Builder接口的详细实现,构建产品Product各个部件,组装成完全的产品工具,并通过getResult()返回详细的工具。
产品的抽象接口Product:须要布局的工具,一样平常包含多个组成部分,构成较为繁芜的工具。
定制者(指挥者)Director:决定了Product的详细创建组成,例如包含何种组件。
辅导出Product繁芜工具的创建,类图表示较为清晰;一样平常利用Builder来完成创建过程。
四、代码实现1.设计一个大略的文件导出系统

根据须要配置对应的文档系统并导出文件,例如导出纯文本内容.text、.html等文件。

元素Element对应这里的Product,即产品的接口

public interface Element {//no method}

1.为供应默认的方法,由实现类自行决定实现何种细节。

元素Element详细实现类-文本

/ Created by Sai on: 25/01/2022 00:48. Description:/public class Text implements Element {private final String content;public Text(String content) {this.content = content;}public String getContent() {return content;}}元素Element详细实现类-图片

/ Created by Sai on: 25/01/2022 00:49. Description:/public class Image implements Element {private final String source;public Image(String source) {this.source = source;}public String getSource() {return source;}}建造器接口Builder,这里既然是文档类型的建造器,命名规范一点的话则为DocumentBuilder,下同:

/ Created by Sai on: 25/01/2022 00:52. Description:/public interface DocumentBuilder {void addText(Text text);void addImage(Image image);String getResult();}

1.分别供应了两个添加内容的方法,addText、addImage。

2.供应一个返回详细内容的方法,getResult。

建造器的详细实现-纯文本文档建造器

public class TextDocumentBuilder implements DocumentBuilder {private final StringBuilder builder = new StringBuilder();@Overridepublic void addText(Text text) {builder.append(text.getContent());}@Overridepublic void addImage(Image image) {//empty implements}@Overridepublic String getResult() {return builder.toString();}}

1.个中纯文本内容不支持添加图片,添加图片的方法则未实现,为空方法。

由于html构造相对付纯文本来说较为繁芜,包括标签,段落等等,如果完备依赖于Element不利于扩展,实现起来比较麻烦,因此对付html类型的文档文件,单独实现自己的一套元素组件。
以Element为媒介动态添加进去。
单独实现html特有的元素HtmlElement

public class HtmlElement {//empty method}Html图片元素组件HtmlImage继续自HtmlElement

public class HtmlImage extends HtmlElement {private final String source;public HtmlImage(String source) {this.source = source;}@Overridepublic String toString() {return String.format("<img src=\"%s\" />", source);}}Html段落文本组件HtmlParagraph同样继续自HtmlElement

public class HtmlParagraph extends HtmlElement {private final String text;public HtmlParagraph(String text) {this.text = text;}@Overridepublic String toString() {return String.format("<p>%s</p>", text);}}一份完全的Html文档可能包含多种HtmlParagraph与HtmlImage的凑集,定义html文档文件类-HtmlDocument

public class HtmlDocument {private final List<HtmlElement> elements = new ArrayList<>();public void add(HtmlElement element) {elements.add(element);}@Overridepublic String toString() {var builder = new StringBuilder();builder.append("<html>");for (HtmlElement element : elements)builder.append(element.toString());builder.append("</html>");return builder.toString();}}对付html建造器的实现:由于html文档的分外性,虽然依据类图的实现流程须要实现DocumentBuilder接口,显然仅仅DocumentBuilder中方法并不能很好的知足需求的定制,但是搭配重新定义一套html文档组装规则(HtmlDocument、HtmlElement、HtmlImage、HtmlParagraph)则能够很好的完成扩展:

public class HtmlDocumentBuilder implements DocumentBuilder {private final HtmlDocument document = new HtmlDocument();@Overridepublic void addText(Text text) {document.add(new HtmlParagraph(text.getContent()));}@Overridepublic void addImage(Image image) {document.add(new HtmlImage(image.getSource()));}@Overridepublic String getResult() {return document.toString();}}完全的文档导出类-Document

public class Document {private final List<Element> elements = new ArrayList<>();public void add(Element element) {elements.add(element);}public void export(DocumentBuilder builder, String fileName) throws IOException {for (Element element : elements) {if (element instanceof Text)builder.addText((Text) element);else if (element instanceof Image)builder.addImage((Image) element);}var writer = new FileWriter(fileName);writer.write(builder.getResult());writer.close();}}测试Demo

public class Demo {public static void show() throws IOException {var document = new Document();document.add(new Text("\n\n\n\n快乐二狗\nphp才是最好的措辞\n"));document.add(new Image("pic1.jpg"));document.export(new HtmlDocumentBuilder(), "sai.html");//文档不添加图片document.export(new TextDocumentBuilder(), "sai.txt");}public static void main(String[] args) throws IOException {show();}}

1.大略的添加了一个文本内容与一个“图片内容”,分别组成了纯文本的文档与Html的文档,但文本的文档是没有添加图片的。

2.导出的文件在同包下,sai.html和sai.text文件。

“纯文本文档”内容

“html”文档

2.优缺陷与局限性思考

1.Builder模式很好的将构建与表现相分离,客户端或者Director可以根据须要灵巧的选择,在同一套构建算法下产生不同的产品,使得表现形式与生产的耦合程度降落。

2.详细的构建细节包含在系统内部,客户端仅仅只须要通过对Builder接口的调用即可完成创建所须要的工具,降落了系统出错的风险。

3.加强了代码的复用性。

4.当然缺陷也是很明显的,如果工具太过于繁芜,组装的配件过多每每不好掌控,造成臃肿,构造也不是很清晰。

5.如果改变产品原有的实现,那么整套流程都须要做出相应的调度,假设产品本身过于繁芜,那么对付后期的掩护是很不利的。
在考虑利用时应根据实际情形,对付繁芜且变革频繁的工具并不适宜利用。

五、实际运用中的变形

实际利用过程中每每简化了标准化的构建流程,当然也是根据详细的业务场景,一样平常会省略了Director辅导类,Builder接口以及详细的ConcreteBuilder实现类,而直接将Builder作为内部类实现在了目标产品类之中。
根据调用者的选择得到不同的产品,当然这种比较单一,可以说是最为大略的一种。
仅仅是一种思想上的运用,或者说也是一种“取巧”的做法。

自身项目中,对付大略筛选工具的定制:

public class FilterGroup {private int id;private String title;private boolean supportMultiSelected;private List<FilterOrderDTO> filterFactors;private FilterGroup(Builder builder) {if (builder == null) {return;}this.id = builder.id;this.title = builder.title;this.supportMultiSelected = builder.supportMultiSelected;this.filterFactors = builder.filterFactors;}public int getId() {return id;}public String getTitle() {return title;}public boolean isSupportMultiSelected() {return supportMultiSelected;}public List<FilterOrderDTO> getFilterFactors() {return filterFactors;}public static class Builder {private int id;private String title;private boolean supportMultiSelected;private List<FilterOrderDTO> filterFactors;public Builder setId(int id) {this.id = id;return this;}public Builder setTitle(String title) {this.title = title;return this;}public Builder setSupportMultiSelected(boolean supportMultiSelected) {this.supportMultiSelected = supportMultiSelected;return this;}public Builder setFilterFactors(List<FilterOrderDTO> filterFactors) {this.filterFactors = filterFactors;return this;}public FilterGroup build() {return new FilterGroup(this);}}}

1.Builder以静态内部类的形式存在于产品的内部,而产品的特色则是:不同的构建组成所对应的产品不同,表现出来的性子也是不同的。
其次Builder中只供应了set方法,而没有get方法。

2.目标产品FilterGroup的布局方法是私有的,并且以Builder为参数。
其余只供应了get方法而没有set方法。

3.即对付目标的产品的构建是通过Builder来完成的,对付用户它仅仅是“可读的”。

4.像实际开拓中,这种分部分构建产品与整体相分离的可以考虑利用Builder模式,核心思想即为整体构建与部件之间的分离,疏松产品构建与产品表示之间的耦合。

标签:

相关文章