设计模式之建造者(Builder)模式

1、定义以及 UML 建模图

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

2、使用场景:

多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又相同。

产品类非常复杂,或者产品类中调用顺序不同产生了不同的作用。

初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。

3、核心类

  • (1) 抽象产品类 computer。
  • (2) Builder 抽象 Builder,规范产品的组建,一般是由子类实现具体的组建过程。
  • (3)MacbookBuilder 具体的Builder类,具体的创建对象的类。
  • (4) Directror 统一组建过程。

以组装一台计算机为主,主要进行组装主机,设置操作系统,设置显示器。

4、具体使用

4.1 计算机抽象类 Computer

Computer.java

public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;

protected Computer(){
}

public void setBoard(String board){
mBoard=board;
}

public void setDisplay(String display) {
this.mDisplay = display;
}

public abstract void setOs() ;

@Override
public String toString() {
return Computer{ +
mBoard=’ + mBoard + +
, mDisplay=’ + mDisplay + +
, mOs=’ + mOs + +
};
}
}

4.2 具体产品类 MacBook

MacBook.java

public class MacBook extends Computer{

protected MacBook() {
}

@Override
public void setOs() {
mOs=Mac OS X 12;
}
}

4.3 抽象 Builder

Builder.java

public abstract class Builder {

abstract void buildBoard(String board);
abstract void buildDisplay(String display);
abstract void buildOs();
abstract Computer build();

}

4.4 具体的 Builder

MacBookBuilder.java

public class MacBookBuilder extends Builder {

private Computer mComputer=new MacBook();
@
Override
void buildBoard(String board) {
mComputer.setBoard(board);
}

@Override
void buildDisplay(String display) {
mComputer.setDisplay(display);
}

@Override
void buildOs() {
mComputer.setOs();
}

@Override
Computer build() {
return mComputer;
}
}

4.5 Director类,负责具体的构造 Computer

Director.java

public class Director {
Builder mBuilser=null;

public Director(Builder builer) {
this.mBuilser = builer;
}

public void construct(String board,String display){
mBuilser.buildDisplay(display);
mBuilser.buildBoard(board);
mBuilser.buildOs();
}
}

4.6 具体使用

Test.java

public class Test {

public static void main(String[] args){
Builder builder=new MacBookBuilder();
Director pcDirector=new Director(builder);
pcDirector.construct(英特尔主板,Retina显示器);

Computer computer = builder.build();
System.out.println(computer.toString());
}

}

5.总结

为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。

作者:OneXzgj

链接:https://www.jianshu.com/p/f958ba891467

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
  1. 免费下载或者VIP会员资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
  2. 提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。
  3. 找不到素材资源介绍文章里的示例图片?
    对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
  4. 付款后无法显示下载地址或者无法查看内容?
    如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理
  5. 购买该资源后,可以退款吗?
    源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源

评论(0)

提示:请文明发言