zoukankan      html  css  js  c++  java
  • 设计模式——建造者模式解析

    0.前言

    写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~


    1.  建造者模式介绍

    建造者模式定义:

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

     

    建造者模式包括的角色:

    1Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现

    2ConcreteBuilderBuilder接口的实现类,并返回组建好对象实例。

    3Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

    4Product:要创建的复杂对象,产品类

     

    建造者模式的使用场景:

    1)当产品有复杂的内部构造时(参数很多)。

    2)需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)。

     

    2.建造者模式实现

    下面是利用建造者模式“组装一台电脑”的实现方式,便于理解该模式如何运用。


    2.1 产品类

    要组装一台电脑(Computer类),我们假设它有三个部件:CPU 、主板以及内存。

    Computer类中提供三个set方法分别设置这三个属性。

    public class Computer {
        private String mCpu;
        private String mMainboard;
        private String mRam;
    
        public void setmCpu(String mCpu) {
            this.mCpu = mCpu;
        }
    
        public void setmMainboard(String mMainboard) {
            this.mMainboard = mMainboard;
        }
    
        public void setmRam(String mRam) {
            this.mRam = mRam;
        }
    }


    2.2 Builder

    下面就是一个抽象的Builder类,里面提供了安装CPU、主板和内存的抽象方法,以及组装成电脑的create方法

    public abstract class Builder {
        public abstract void buildCpu(String cpu);
        public abstract void buildMainboard(String mainboard);
        public abstract void buildRam(String ram);
        public abstract Computer create();
    }


    2.3 Builder实现类

    下面是一个继承Builder的子类,里面不仅新建了Computer的实例,还提供了安装CPU、主板和内存的具体实现方法,并且在组装成电脑的create方法将该Computer对象实例返回

    public class MyComputerBuilder extends Builder {
        private Computer mComputer = new Computer();
        @Override
        public void buildCpu(String cpu) {
            mComputer.setmCpu(cpu);
        }
    
        @Override
        public void buildMainboard(String mainboard) {
            mComputer.setmMainboard(mainboard);
        }
    
        @Override
        public void buildRam(String ram) {
            mComputer.setmRam(ram);
        }
    
        @Override
        public Computer create() {
            return mComputer;
        }
    }


    2.4 Director

    指挥者(Director)类用来规范组装电脑的流程顺序,先安装主板,再安装CPU,最后安装内存并组装成电脑。

    public class Direcror {
        Builder mBuild=null;
        public Direcror(Builder build){
            this.mBuild=build;
        }
        public Computer CreateComputer(String cpu,String mainboard,String ram){
            //规范建造流程,这个顺序是由它定的
           this.mBuild.buildMainboard(mainboard);
           this.mBuild.buildCpu(cpu);
           this.mBuild.buildRam(ram);
           return mBuild.create();
        }
    }


    2.5 使用

    Builder mBuilder = new MyComputerBuilder();
    Direcror mDirecror=new Direcror(mBuilder);
    mDirecror.CreateComputer("i7","Intel主板","mRam");//返回Computer实例对象
    

    以上便完成了整个建造者模式的实现细节。


    3 建造者模式精简版

    在现实开发中,往往省去Director的角色,而直接使用一个Buider来进行对象的组装,这个Builder通常为链式调用,比如在Android的AlertDialog.Builder中就是这样做的。代码大致如下:

    new MyComputerBuilder.buildCpu("A").buildMainboard("B"). buildRam("C").create();


    建造者模式优缺点

    建造者模式的优点:

    1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。

    2)建造者类逻辑独立,易拓展

     

    建造者模式的缺点:

    很明显产生了多余的Build对象以及Dirextor对象,消耗了内存。


  • 相关阅读:
    CF1137FMatches Are Not a Child‘s Play【LCT】
    P4491[HAOI2018]染色【多项式,二项式反演】
    P3170[CQOI2015]标识设计【插头dp】
    log4j 使用教程说明
    log4j中Logger.getLogger()加载一个类提示错误
    编程基础 0x00008 的0x代表什么?
    编程基础 快速的进行 2进制,10进制,16进制 的 相互转换
    Java 基础 equals,hashcode和==的区别
    位运算 左移右移运算符 >>, <<, >>>
    Java 虚拟机 2.2 运行时数据区 Runtime Data Area
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461558.html
Copyright © 2011-2022 走看看