Android首页投稿(暂停使用,暂停投稿)Android知识

设计模式之建造者模式

2017-07-12  本文已影响103人  唠嗑008
1、初识建造者模式

建造者模式属于创建型模式。比如说:楼房是千差万别的,楼房的外形,层数,内部房间的数量,房间的装饰都不一样。但是对于建造者来说,抽象出来的建筑流程是确定的。因为建筑一座楼房,都可以归纳为几个步骤:1打桩、2建地基、3搭框架、4内部建设。同理,建造者设计模式也是基于这样的概念而生的,这个设计模式用来解决什么样的情况呢:即流程不变,但每个流程实现的具体细节是会变化的。这样的情况,可以考虑使用建造者。就像盖房子,4个流程都必须有,但每个流程各自的实现细节,各个房子各有不同。建造者模式的好处就是保证了流程不会变化,即流程不会增加也不会遗漏,也不会产生流程次序的错误。而建造者模式,保证了流程的确定性,而流程内部的实现细节,是可继承扩展的。从根源上解决了流程不规范的问题。

撸代码的时候,如果你遇到一个需要把控流程,但流程中的实现细节各有许多的方式,你可以采用建造者模式。用一个director类把控流程,而用许多不同的builder去建造流程中的细节并产生产品。这样,生产出来的产品基本是不会出问题的。因为流程把控好了。你可以有多个builder去负责建造生产产品,而让director去把控流程。如果有新的产品,但是流程一致,你可以再扩张出一个builder来。这样,你看,建造者模式是不是很符合OCP原则呢。

2、建造者模式的概念

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

大概的意思是说:一套的构建过程可以有不同的产品(表示)出来。这些产品(表示)都按照这一套的构建过程被生产出来。

建造者模式通常包括以下这几个角色:

建造者模式的UML图(通过图形来串联自己所学的知识是非常高效的学习方式之一)

Paste_Image.png

3、一个建造者的实例。

汽车的构造当中,包括汽车品牌、型号、价格、产地等等。

复杂对象Product

/**
 * 复杂对象Product,这里是汽车
 * @author Administrator
 *
 */
public class Car {

    private String name; //汽车品牌
    private String type; //具体的型号
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    
}

抽象的Builder:

/**
 * 抽象的构造者
 * @author Administrator
 *
 */
public interface Builder {
    
    /**
     * 一般包含2个部分:1、抽象的建造方法;2:返回建造好的复杂对象
     * @param name
     */
    
    void buildName(String name);
    void buildType(String type);
    Car build();
}

具体的建造者

/**
 * 具体的构建者
 * @author Administrator
 *
 */
public class ConstractBuilder implements Builder{
    
    Car car = new Car();
    
    @Override
    public void buildName(String name) {
        
        car.setName(name);
        
    }

    @Override
    public void buildType(String type) {
        
        car.setType(type);
    }
    
    @Override
    public Car build() {
        
        return car;
    }
}

导演,负责流程规范,在导演类中可以注入建造者对象。

/**
 * 导演(负责人)负责流程规范,
 * @author Administrator
 *
 */
public class Director {
    public Car buildCar1(){
        ConstractBuilder builder = new ConstractBuilder();
        builder.buildName("宝马");
        builder.buildType("x6");
        return builder.build();
    }
    
    public Car buildCar2(){
        ConstractBuilder builder = new ConstractBuilder();
        builder.buildName("奔驰");
        builder.buildType("c200");
        return builder.build();
    }
}

** 客户端调用**

public class Client {

    public static void main(String[] args) {
        Director director = new Director(); //创建导演类
        //构造对象
        Car car1 = director.buildCar1();
        Car car2 = director.buildCar2();
        System.out.println("car1 name:"+car1.getName()+"  type:"+car1.getType());
        System.out.println("car2 name:"+car2.getName()+"  type:"+car2.getType());
    }
}

** 4、使用建造者模式的好处**

5、使用建造者模式的场合

上一篇下一篇

猜你喜欢

热点阅读