设计模式【4】-- 建造者模式详解

本文详细介绍了建造者模式,通过实例解析其结构与应用场景。建造者模式将复杂对象的构建与表示分离,使得创建过程可以创建不同的表示。文章通过电脑组装的例子展示了如何运用建造者模式,包括产品类、抽象生成器、具体建造者和指挥者的角色。文中提到了建造者模式在解耦构建过程、允许独立创建各部分的优势,以及在不同构造顺序产生不同结果的场景中的适用性。
摘要由CSDN通过智能技术生成

开局一张图,剩下全靠写…

引言

设计模式集合:http://aphysia.cn/categories/designpattern

如果你用过 Mybatis ,相信你对以下代码的写法并不陌生,先创建一个builder对象,然后再调用.build()函数:

InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();

上面其实就是我们这篇文章所要讲解的 建造者模式,下面让我们一起来琢磨一下它。

什么是建造者模式

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(来源于百度百科)

建造者模式,其实是创建型模式的一种,也是23种设计模式中的一种,从上面的定义来看比较模糊,但是不得不承认,当我们有能力用简洁的话去定义一个东西的时候,我们才是真的了解它了,因为这个时候我们已经知道它的界限在哪。

所谓将一个复杂对象的构建与它的表示分离,就是将对象的构建器抽象出来,构造的过程一样,但是不一样的构造器可以实现不一样的表示。

结构与例子

建造者模式主要分为以下四种角色:

  • 产品(Product):具体生产器要构造的复杂对象
  • 抽象生成器(Bulider):抽象生成器是一个接口,创建一个产品各个部件的接口方法,以及返回产品的方法
  • 具体建造者(ConcreteBuilder):按照自己的产品特性,实现抽象建造者对应的接口
  • 指挥者(Director):创建一个复杂的对象,控制具体的流程

说到这里,可能会有点懵,毕竟全都是定义,下面从实际例子来讲讲,就拿程序员最喜欢的电脑来说,假设现在要生产多种电脑,电脑有屏幕,鼠标,cpu,主板,磁盘,内存等等,我们可能立马就能写出来:

public class Computer {
   
    private String screen;
    private String mouse;
    private String cpu;
    private String mainBoard;
    private String disk;
    private String memory;
  	...
    public String getMouse() {
   
        return mouse;
    }

    public void setMouse(String mouse) {
   
        this.mouse = mouse;
    }

    public String getCpu() {
   
        return cpu;
    }

    public void setCpu(String cpu) {
   
        this.cpu = cpu;
    }
  	...
}

上面的例子中,每一种属性都使用单独的set方法,要是生产不同的电脑的不同部件,具体的实现还不太一样,这样一个类实现起来貌似不是很优雅,比如联想电脑和华硕电脑的屏幕的构建过程不一样,而且这些部件的构建,理论上都是电脑的一部分,我们可以考虑流水线式的处理。

当然,也有另外一种实现,就是多个构造函数,不同的构造函数带有不同的参数,实现了可选的参数:

public class Computer {
   
    private String screen;
    private String mouse;
    private String cpu;
    private String mainBoard;
    private String disk;
    private String memory;

    public Computer(String screen) {
   
        this.screen = screen;
    }

    public Computer(String screen, String mouse) {
   
        this.screen = screen;
        this.mouse = mouse;
    }

    public Computer(String screen, String mouse, String cpu) {
   
        this.screen =</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值