zoukankan      html  css  js  c++  java
  • 设计模式-建造者模式

    建造者模式是创建复杂对象时使用。

    工厂模式,只是创建对象实例,但是并没有给对象实例赋值,比如创建Student实例,但是并没有给Student实例的属性(name,age,classz)等赋值,建造模式实际上就是在实例化对象同时给对象的属性赋值的过程。

    例如Bike对象实例包含属性(轮胎,颜色,定位GPS), 但是OFO和摩拜都属于自行车,我们需要根据厂商的需求制造OFO和摩拜两种车型(也就是给属性赋值不同的属性)。

    建造者模式的UML主要包含;

    实体对象(具体产品):

    具体的建造者(实现建造接口规范,持有实体对象):

    建造者接口规范(定义各个部件的构建方法,定义返回的产品类型):

    制造者(指挥者):

    如图:

     这里举例一个电脑的组装过程,电脑都具有属性(CPU,内存,磁盘),但是根据电脑具体的产品,我们可以制造ThinkPad,Mac等不同型号

    首先定义具体产品:

    package com.wehaicao.design;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    
    /**
     * 建造的实体对象
     */
    @Data
    public class Computer implements Serializable {
    
        private String cpu ;
        private String memory ;
        private String disk ;
    }

    定义创建接口规范:

    package com.wehaicao.design;
    
    /**
     * 定义对象创建规范
     */
    public interface IBuilder {
    void buildCpu();
    
        void buildMemory();
    
        void buildDisk();
    
        Computer getComputer();
    }

    定义ThinkPad的创建过程:

    package com.wehaicao.design;
    
    /**
     * 联想电脑创建实现
     */
    public class ThinkPadComputer implements IBuilder {
    
        Computer computer = null ;
        public ThinkPadComputer() {
            computer = new Computer();
        }
    
        @Override
        public void buildCpu() {
            computer.setCpu("这是thinkPad 的CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("这是thinkPad 的Memory");
        }
    
        @Override
        public void buildDisk() {
            computer.setDisk("这是thinkPad 的Disk");
        }
    
        @Override
        public Computer getComputer() {
            return computer;
        }
    }

    定义MacBook 的创建过程

    package com.wehaicao.design;
    
    /**
     * @Author: WenQ
     * @Date: 2019/4/10
     * @Description: Mac电脑构建
     */
    public class MacComputer implements IBuilder {
        Computer computer = null ;
        public MacComputer() {
            computer = new Computer();
        }
    
        @Override
        public void buildCpu() {
            computer.setCpu("MacComputer 装配CPU");
        }
    
        @Override
        public void buildMemory() {
            computer.setMemory("MacComputer 装配内存");
        }
    
        @Override
        public void buildDisk() {
            computer.setDisk("MacComputer 装配磁盘");
        }
    
        @Override
        public Computer getComputer() {
            return computer;
        }
    }

    从现在已有代码,我们可以看出如果我们想要造一个MacBook,我们只需要调用MacBook 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取MacBook

    同理,我们要制造ThinkPad,我们需要调用ThinkPad 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取ThinkPad .

    那我们此时如果对制造过程做一个抽象,只需要要传入Ibuider接口实例,抽象方法帮我们对各个属性赋值不是更好么,所以:

    就有了指挥者:

    package com.wehaicao.design;
    
    /**
     * @Author: WenQ
     * @Date: 2019/4/10
     * @Description: 指挥者,负责对象的创建过程
     */
    public class Director {
    
        public Computer createComputer(IBuilder abstactBuilder){
            abstactBuilder.buildCpu();
            abstactBuilder.buildDisk();
            abstactBuilder.buildMemory();
            return abstactBuilder.getComputer();
        }
    }

    自此,我们的假造者模式已经完成。如果需要MacBook,我们只需要new一个空的MacBook传递给Director实例的createComputer即可。

    测试代码如下:

    package com.wehaicao.design;
    
    /**
     * @Author: WenQ
     * @Date: 2019/4/10
     * @Description:
     */
    public class Test {
        public static void main(String[] args) {
            Director director = new Director();
            Computer computer = director.createComputer(new MacComputer());
            Computer computer1 = director.createComputer(new ThinkPadComputer());
            System.out.println(computer1);
            System.out.println(computer);
        }
    }

    运行结果如下:

  • 相关阅读:
    一个该不该抽出来的函数引起的思考
    规范代码之方法重用
    web列表分页与问题
    win10系统休眠无法唤醒,无法完全关机问题
    java父子类的初始化顺序--个人总结
    java并发包-concurrentMap和CopyOnWriteArrayList
    大浏览量系统的静态化架构设计
    Angular4 innerHtml呈现富文本内容样式
    Angular4项目运行时URL自动加#方法
    在Angular4中使用ng2-baidu-map详解
  • 原文地址:https://www.cnblogs.com/wenq001/p/10687732.html
Copyright © 2011-2022 走看看