设计模式——02.Build设计模式

mac2025-01-16  7

简介

Build模式是一步一步创建复杂对象的模式。允许用户在不知道内部构造细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和构造它的部件解耦,使得构建的过程和部件的表示隔离开,两者之间的耦合度降到最低。

定义

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

使用场景

相同的方法,不同的执行顺序,产生不同的事件结果。多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。产品类非常复杂,或者产品类中调用的顺序不同产生不同的作用。初始化一个对象特别复杂,如参数特别多且很多有默认参数时。

关键

原始版——四个角色

一个产品类,需要被构建的产品一个抽象Builder类,隔离产品组件的构建一个具体构建产品的Build实现类,产品组件的具体构成一个组件类,组件与产品的组装 /** * 产品类-Computer */ public class Computer { private String mBoard; private String mDisplay; private String mOS; public String getmBoard() { return mBoard; } public void setmBoard(String mBoard) { this.mBoard = mBoard; } public String getmDisplay() { return mDisplay; } public void setmDisplay(String mDisplay) { this.mDisplay = mDisplay; } public String getmOS() { return mOS; } public void setmOS() { this.mOS = mOS; } } /** * 抽象Build类-构建与产品类相关的部件 */ public abstract class Builder { /** *构建主机组件 */ public abstract void setBoard(String board); /** * 构建显示器组件 */ public abstract void setDisplay(String display); /** * 构建操作系统组件 */ public abstract void setOs(); /** * 构建产品 */ public abstract Computer create(); } /** * 抽象Build的实现类-真正构建产品的类 */ public class ComputerBuilder extends Builder { private Computer computer = new Computer(); @Override public void setBoard(String board) { computer.setmBoard(board); } @Override public void setDisplay(String display) { computer.setmDisplay(display); } @Override public void setOs() { computer.setmOS(); } @Override public Computer create() { return computer; } } /** * 组装类:将builder构建的产品部件组装成产品,对外隐藏内部组装细节 */ public class Director { private Builder mBuilder; public Director(Builder builder) { this.mBuilder = builder; } public void construct(String board, String display) { mBuilder.setBoard(board); mBuilder.setDisplay(display); mBuilder.setOs(); } }

使用

Builder builder = new ComputerBuilder(); Director director = new Director(builder); director.construct("因特尔主板", "三星显示器"); Computer computer = builder.create();

简易版——两个角色

一个产品类,需要被构建的产品一个Builder类,一般为产品类的静态内部类,负责组件的构建和产品的组装 public class Computer { private String mBoard; private String mDisplay; private String mOS; public String getmBoard() { return mBoard; } public void setmBoard(String mBoard) { this.mBoard = mBoard; } public String getmDisplay() { return mDisplay; } public void setmDisplay(String mDisplay) { this.mDisplay = mDisplay; } public String getmOS() { return mOS; } public void setmOS() { this.mOS = mOS; } public static class Builder { private String mBoard; private String mDisplay; private String mOS; public Builder setBoard(String board) { this.mBoard = board; return this; } public Builder setDisplay(String display) { this.mDisplay = display; return this; } public Builder setOs() { return this; } /** * 组装产品 */ private void construct(Computer computer) { computer.setmBoard(mBoard); computer.setmDisplay(mDisplay); computer.setmOS(); } public Computer create() { Computer computer = new Computer(); construct(computer); return computer; } }

使用

Computer computer = new Computer.Builder().setBoard("") .setDisplay("") .setOs() .create();

小结

Builder模式通常作为配置类的构建器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免作为过多的setter方法。Builder模式比较常见的实现形式是通过链式调用,这样使得代码更加简洁、易懂。

优点

良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节建造者独立,容易扩展

缺点

会产生多余的Builder对象以及Director对象,消耗内存。
最新回复(0)