设计模式之建造者模式

建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,使构造过程与表示分离。常见应用场景包括执行顺序不同导致不同结果、组装多种部件产生不同产品等。以组装电脑为例,电脑由CPU、内存、显示器、键盘和鼠标组成,通过不同配置组合,可以创建低配或高配电脑。在实现中,定义了电脑接口及具体实现,并通过测试类展示了组装过程。
摘要由CSDN通过智能技术生成

建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。

模式的使用场景

1.相同的方法,不同的执行顺序,产生不同的事件结果时;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。

UML图如下
在这里插入图片描述
以组装一台电脑为例。电脑分为低配和高配,每台电脑又具备cpu、Ram(内存)、tv(显示器)、keyBoard(键盘)、mouse(鼠标)这几个基本的零件组成。

电脑类如下

    package com.example.buildDemo;
    
    /**
     * description
     * <p>
     * 电脑基类
     * @author slliao
     * @date 2019/5/6 10:24.
     */
    
    public class Computer {
        private String cpu;
        private String Ram;
        private String tv;
        private String keyBoard;
        private String mouse;
    
        public String getCpu() {
            return cpu;
        }
    
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
    
        public String getRam() {
            return Ram;
        }
    
        public void setRam(String ram) {
            this.Ram = ram;
        }
    
        public String getTv() {
            return tv;
        }
    
        public void setTv(String tv) {
            this.tv = tv;
        }
    
        public String getKeyBoard() {
            return keyBoard;
        }
    
        public void setKeyBoard(String keyBoard) {
            this.keyBoard = keyBoard;
        }
    
        public String getMouse() {
            return mouse;
        }
    
        public void setMouse(String mouse) {
            this.mouse = mouse;
        }
    
        @Override
        public String toString() {
            return "Computer{" +
                    "cpu='" + cpu + '\'' +
                    ", Ram='" + Ram + '\'' +
                    ", tv='" + tv + '\'' +
                    ", keyBoard='" + keyBoard + '\'' +
                    ", mouse='" + mouse + '\'' +
                    '}';
        }
    }

定义一个组装电脑的接口

package com.example.buildDemo;
    
    /**
     * description
     * <p>
     *
     * @author slliao
     * @date 2019/5/6 10:19.
     */
    public interface BuildComputer {
        /**
         * 加cpu
         */
        void addCpu();
    
        /**
         * 加内存条
         */
        void addRam();
    
        /**
         * 加显示器
         */
        void addTv();
    
        /**
         * 加键盘
         */
        void addKeyboard();
    
        /**
         * 加显示器
         */
        void addMouse();
    
        /**
         * 取电脑数据
         * @return
         */
        Computer getComputer();
    }

定义一个低配版本的电脑

package com.example.buildDemo;

/**
 * description
 * <p>
 * 低配版
 * @author slliao
 * @date 2019/5/6 10:23.
 */
public class LowComputer implements BuildComputer{

    private Computer computer;

    public LowComputer() {
        this.computer = new Computer();
    }

    @Override
    public void addCpu() {
        computer.setCpu("i3");
    }

    @Override
    public void addRam() {
        computer.setRam("4G");
    }

    @Override
    public void addTv() {
        computer.setTv("普通屏幕");
    }

    @Override
    public void addKeyboard() {
        computer.setKeyBoard("普通键盘");
    }

    @Override
    public void addMouse() {
       computer.setMouse("普通鼠标");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

定义一个高配版的电脑

package com.example.buildDemo;

/**
 * description
 * <p>
 *  高配版
 * @author slliao
 * @date 2019/5/6 10:23.
 */
public class HighLevelComputer implements BuildComputer{

    private Computer computer;

    public HighLevelComputer(){
        this.computer=new Computer();
    }
    public void setComputer(Computer computer) {
        this.computer = computer;
    }

    @Override
    public void addCpu() {
        computer.setCpu("i7");
    }

    @Override
    public void addRam() {
        computer.setRam("16G");
    }

    @Override
    public void addTv() {
        computer.setTv("高级屏幕");
    }

    @Override
    public void addKeyboard() {
        computer.setKeyBoard("高级机械键盘");
    }

    @Override
    public void addMouse() {
       computer.setMouse("高级鼠标");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

测试类如下

package com.example.buildDemo;

/**
 * description
 * <p>
 *
 * @author slliao
 * @date 2019/5/6 10:36.
 */
public class Test {
    public static void main(String[] args) {
        //创建组装人员
        Builder builder = new Builder();
        //低配版对象
        LowComputer lowComputer = new LowComputer();
        //告诉组装人员创建低配版电脑
        builder.setBuildComputer(lowComputer);
        //开始组装电脑
        builder.CreateComputer();
        Computer computer = builder.getComputer();
        //输出配置
        System.out.println("电脑配置为:"+computer);

        //创建组装人员
        Builder builder2 = new Builder();
        //低配版对象
        HighLevelComputer highLevelComputer = new HighLevelComputer();
        //告诉组装人员创建高配版电脑
        builder.setBuildComputer(highLevelComputer);
        //开始组装电脑
        builder.CreateComputer();
        Computer computer2 = builder.getComputer();
        //输出配置
        System.out.println("电脑配置为:"+computer2);
    }
}

结果为:
在这里插入图片描述

这种是基本的建造者使用方法,以后会遇到@build这个标签,这种是属于变种的建造者模式。
参考文献:https://www.jianshu.com/p/afe090b2e19c
https://blog.csdn.net/hjxgood/article/details/70316562

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值