Java 设计模式 -- 建造者模式

建造者模式

建造者模式就是一步一步的创建一个复杂的对象,而且允许用户指定复杂对象的类型和内容。

Builder 类是一个抽象类,用于定义一些创建子部件的方法,Builder类中应该还有一个 getResult() 方法,用于将创建好的部件组装成一个产品返回。

Director 类又称为指挥者,用于安排复杂对象的建造次序,通过construct() 方法,指导Builder类完成组装。

通过一个例子来更好的理解建造者模式,比如说现在的手机都支持更换主题,所有的主题建造过程都是类似的,比如说更换图标,背景,提示音,那么这个时候就可以通过建造者模式来完成这一过程。

先来设计一下Product和Builder类

public class Product {

    private String mBackground;
    private String mIcon;
    private String mSounds;

    public String getBackground() {
        return mBackground;
    }
    public void setBackground(String background) {
        mBackground = background;
    }
    public String getIcon() {
        return mIcon;
    }
    public void setIcon(String icon) {
        mIcon = icon;
    }
    public String getSounds() {
        return mSounds;
    }
    public void setSounds(String sounds) {
        mSounds = sounds;
    }   

}


public abstract class Builder {

    private Product mProduct = new Product();

    public Product getResult(){
        return mProduct;
    }

    public abstract void buildBackground();
    public abstract void buildIcon();
    public abstract void buildSounds();
}

可见,不论什么样的主题,以上代码都是通用的,对于不同的主题,只需要在ConcreteBuilder中进行设置就可以了。

public class ConcreteBuilder extends Builder{

    public void buildBackground(){
        mProduct.setBackground("Black");
    }
    public void buildIcon(){
        mProduct.setIcon("MyIcon");
    }
    public void buildSounds(){
        mProduct.setSounds("MySounds");
    }
}

既然产品生产过程已经构建出来了,那么就到了Director 类发挥作用的时候了,现在就由Director 来指挥各个部件的创造,并且将组装好的产品返回给客户端。

public class Director {

    public Product construct(Builder builder){
        builder.buildBackground();
        builder.buildIcon();
        builder.buildSounds();
        return builder.getResult();
    }

}

可见Director 类中只有一个简单的方法,有的时候当产品的部件不是很多的时候,完全可以将该方法放到Builder类中,从而省略Director 类。

已经看出,建造者模式和抽象工厂模式很类似。其实,抽象工厂模式更侧重于生产 “部件” , 而建造者模式侧重于将各个 部件组装成一个产品。



作者:ghwaphon
链接:https://www.jianshu.com/p/7d16da4e61b8
來源:简书

猜你喜欢

转载自blog.csdn.net/GarfieldEr007/article/details/80714802