设计模式——建造者模式

0.前言

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

 

1.  建造者模式介绍

建造者模式定义:

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

 

建造者模式包括的角色:

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

(2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。

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

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

 

建造者模式的使用场景:

(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实例来进行对象的组装。

 

 

建造者模式优缺点

建造者模式的优点:

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

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

 

建造者模式的缺点:

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

 

5 通俗理解

builder模式:增加静态内部类,Builder的属性和对象(Student)的属性是一样的,Builder中定义build()方法,在build()方法中构建对象,  使用的时候,先创建Builder对象,再通过builder.build( )获得对象(Student)

public class Student{
    private String name;    private int age;
    private double height;
    private double weight;
 
    private Student(Builder builder) {
        this.name=builder.name;
        this.age=builder.age;
        this.height=builder.height;
        this.weight=builder.weight;
    }
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public double getHeight() {
        return height;
    }
 
    public void setHeight(double height) {
        this.height = height;
    }
 
    public double getWeight() {
        return weight;
    }
 
    public void setWeight(double weight) {
        this.weight = weight;
    }
 
    static class Builder{
        private String name;
        private int age;
        private double height;
        private double weight;
        public Builder setName(String name){
            this.name=name;
            return this;
        }
        public Builder age(int age){
            this.age=age;
            return this;
        }
        public Builder height(double height){
            this.height=height;
            return this;
        }
 
        public Builder weight(double weight){
            this.weight=weight;
            return this;
        }
 
        public Student  build(){
            return new Student(this);     
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值