第八章:设计模式-建造者模式

一)介绍

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变动的部件,和不变动的部件分离开。

 

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点:

1、产品必须有共同点,范围有限制。

2、如内部变化复杂,会有很多的建造类。

 

使用场景:

1、需要生成的对象具有复杂的内部结构。

2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

 

二)文本编辑器

第一步:创建一个抽象类,设置文本的标题和内容

package com.oysept.builder;

public abstract class Builder {
    public abstract void makeTitle(String title);
    public abstract void makeContent(String content);
}

 

第二步:创建一个PDF文件编辑器

package com.oysept.builder;

public class PDFBuilder extends Builder {

    @Override
    public void makeTitle(String title) {
        System.out.println("设置PDF文件标题: " + title);
    }

    @Override
    public void makeContent(String content) {
        System.out.println("设置PDF文件内容: " + content);
    }
}

 

第三步:创建一个HTML文本编辑器

package com.oysept.builder;

public class HTMLBuilder extends Builder {

    @Override
    public void makeTitle(String title) {
        System.out.println("设置HTML标题: " + title);
    }

    @Override
    public void makeContent(String content) {
        System.out.println("设置HTML内容: " + content);
    }
}

 

第四步:创建一个监察者

package com.oysept.builder;

public class Director {

    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
	
    public void construct(String title, String content) {
        builder.makeTitle(title);
        builder.makeContent(content);
    }
}

 

第五步:测试

package com.oysept.builder;

public class TestBuilder {

    public static void main(String[] args) {
        Builder builder = new PDFBuilder();
        Director director = new Director(builder);
        director.construct("Test PDF标题", "Test PDF内容");
    }
}

 

三)电脑组装

给一台电脑安装主板、显示器、并安装对应的操作系统

第一步:创建一个电脑抽象类,包含主板、显示器、系统等方法

package com.oysept.builder.computer;

public abstract class Computer {
	
    public void setBoard(String board) {
        System.out.println("主板: " + board);
    }
	
    public void setDisplay(String display) {
        System.out.println("显示器: " + display);
    }
	
    abstract void setOS(); // 系统
}

 

第二步:安装MacBook系统

package com.oysept.builder.computer;

public class MacBook extends Computer {

    @Override
    public void setOS() {
        System.out.println("系统: MacBook");
    }
}

 

第三步:安装Windows系统

package com.oysept.builder.computer;

public class Windows extends Computer {

    @Override
    public void setOS() {
        System.out.println("系统: Win10");
    }
}

 

第四步:创建一个建造者抽象类,用于安装主板、显示器、系统

package com.oysept.builder.computer;

public abstract class Builder {

    public abstract void buildBoard(String board);
    public abstract void buildDisplay(String display);
    public abstract void buildOS();
}

 

第五步:组装MacBook电脑

package com.oysept.builder.computer;

public class MacBookBuilder extends Builder {

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

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

    @Override
    public void buildOS() {
        macbook.setOS();
    }
}

 

第六步:组装Windows电脑

package com.oysept.builder.computer;

public class WindowsBuilder extends Builder {

    private Computer windows = new Windows();
	
    @Override
    public void buildBoard(String board) {
        windows.setBoard(board);
    }

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

    @Override
    public void buildOS() {
        windows.setOS();
    }
}

 

第七步:创建一个监工类

package com.oysept.builder.computer;

public class Director {
	
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
	
    public void construct(String board, String display) {
        builder.buildBoard(board);
        builder.buildDisplay(display);
        builder.buildOS();
    }
}

 

第八步:测试

package com.oysept.builder.computer;

public class TestBuilder {

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

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值