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);
        }
    }

    运行结果如下:

  • 相关阅读:
    出栈序列的可能性判定
    阿里离线数据处理平台2013暑期学校
    终于算完了这道『1+1』
    数据结构学习笔记之一 链表
    经典解释监视器和对象锁
    Sybase中字符串替换函数 STR REPLACE
    使用Arrays sort 方法進行排序
    clustered和nonclustered索引的区别
    Java序列化的作用和反序列化
    Java多线程下载并具断点续传功能JAR
  • 原文地址:https://www.cnblogs.com/wenq001/p/10687732.html
Copyright © 2011-2022 走看看