设计模式系列15---构表分离的建造者模型

enter image description here

现在来讲一件很有意思的故事,上面的画很纯洁,只有一种蓝色。但不得不说这图片还是有色差,不能很好的还原实际的色彩,如果有你机会,可以去看下他的IKB色彩是多么的蓝。
这种蓝被叫做国际克莱因蓝(international klein blue,缩写IKB),以伊夫·克莱因(Yves Klein)的名字来命名的。

这一种独特的天青石蓝色是在他的化学家友人EdouardAdam的帮助下合成的。
克莱因相信,只有最单纯的色彩才能唤起最强烈的心灵感受力。

一些艺术家使用各种色彩以求获得艺术生命力,而克莱因宁愿回归单纯。
“克莱因蓝”的 RGB 比值是0:47:147,但是明确的数据并不能减少人们面对它时那种震惊——蓝色本身象征着天空和海洋,象征着没有界限,又因为“克莱因蓝”太过纯净,以至于很难找到可与之搭配的色彩进入人们的视野,因此,它的冲击力格外强烈。
这种蓝被誉为一种理想之蓝、绝对之蓝,其明净空旷往往使人迷失其中。
克莱因曾说:“表达这种感觉,不用解释,也无需语言,就能让心灵感知——我相信,这就是引导我画单色画的感觉。”

当然啦,现在他的画那是厉害啊,例如他的《IKB 92》卖了一个多亿。也像这个一样,纯蓝色!!!

好了,看完这个故事,现在我们来做一个颜料板,用于生成艺术家想要的颜色。

代码实现

来看下我们的颜料板

public class IkbColorBuilder extends ColorBuilder {


    private IkbColorModel ikbColor = new IkbColorModel();

    @Override
    public void setSequence(List<Integer> sequence) {
        ikbColor.setColorList(sequence);
    }

    public IkbColorBuilder addGreenSeq() {
        this.ikbColor.getColorList().add(Color.GREEN);
        return this;
    }

    public IkbColorBuilder addBlueSeq() {
        this.ikbColor.getColorList().add(Color.BLUE);
        return this;
    }

    public IkbColorBuilder addRedSeq() {
        this.ikbColor.getColorList().add(Color.RED);
        return this;
    }

    @Override
    public ColorModel getColorModel() {
        return this.ikbColor;
    }
}

public abstract class ColorBuilder {

    public abstract void setSequence(List<Integer> sequence);

    public abstract ColorModel getColorModel();

}

我们的颜料板做的还是很简单的,根据用户的需要,可以不断的加R,G,B三种颜色。

接着是我们的颜料模型,不同材料做出来的颜色是不一样的
就像有统一的步骤,但中间用材不当,做出来的菜味道显然不会完全一样。

public abstract class ColorModel {

    List<Integer> colorList = new ArrayList<>(); 


    final public void generateColor() {
        for (int color : colorList) {
            if (color == Color.GREEN) {
                addGreenMaterial();
            } else if (color == Color.RED) {
                addRedMaterial();
            } else if (color == Color.BLUE) {
                addBlueMaterial();
            }
        }
    } 

    abstract void addRedMaterial();

    abstract void addGreenMaterial();

    abstract void addBlueMaterial();

    public List<Integer> getColorList() {
        return colorList;
    }

    public void setColorList(List<Integer> colorList) {
        this.colorList = colorList;
    }
}    

这个是我们的model,他可以根据知道的颜料添加不同的颜料素材下去。从而生成我们需要的

public class IkbColorModel extends ColorModel {

    @Override
    void addRedMaterial() {

        System.out.println("添加特别的红色材料");
    }

    @Override
    void addGreenMaterial() {
        System.out.println("添加特别的绿色材料");
    }

    @Override
    void addBlueMaterial() {
        System.out.println("添加特别的蓝色材料");
    }
}

而我们的具体的色彩只需要实现各个方法,去提供他们特有的素材就可以了。

public class Client {

    public static void main(String[] args) {

        IkbColorBuilder builder = new IkbColorBuilder();
        IkbColorModel colorModel = (IkbColorModel) builder.addBlueSeq().addGreenSeq().addRedSeq().addBlueSeq().getColorModel();
        colorModel.generateColor();
    }
}    

这样我们就可以利用构建者模型来生成我们的IKB颜色。然后绘制名画了!

不过时代发展到现在,很多东西都是现成搞好的了,我们不再需要自己去调出来特定的色。
一般都可以直接去买回来用,因此我们有多下面这个

public class Director {

    private List<Integer> colorSeq = new ArrayList<>();
    private IkbColorBuilder ikbColorBuilder = new IkbColorBuilder();

    public IkbColorModel getIkbColor() {
        this.colorSeq.clear();
        this.colorSeq.add(Color.BLUE);
        this.colorSeq.add(Color.GREEN);
        this.colorSeq.add(Color.RED);
        this.colorSeq.add(Color.BLUE);
        this.colorSeq.add(Color.BLUE);
        this.ikbColorBuilder.setSequence(colorSeq);
        return (IkbColorModel) this.ikbColorBuilder.getColorModel();
    }

    public ColorModel getYxbColor() {
        this.colorSeq.clear();
        this.colorSeq.add(Color.BLUE);
        this.colorSeq.add(Color.GREEN);
        this.colorSeq.add(Color.RED);
        this.ikbColorBuilder.setSequence(colorSeq);
        return this.ikbColorBuilder.getColorModel();
    }

    public ColorModel getEaxColor() {
        this.colorSeq.clear();
        this.colorSeq.add(Color.BLUE);
        this.colorSeq.add(Color.GREEN);
        this.colorSeq.add(Color.BLUE);
        this.ikbColorBuilder.setSequence(colorSeq);
        return this.ikbColorBuilder.getColorModel();
    }
}

他封装了很多我们常用的颜料配置色彩,我们直接用就好了

public class Client {

    public static void main(String[] args) {

        Director director = new Director();
        ColorModel colorModel = director.getIkbColor()
        colorModel.generateColor();
    }
}

类图

enter image description here

后记

用弄好的色彩颜料表达出不一样的东西,还是挺有意思的.
我们有了颜料,但如何画,画得如何,就靠个人造诣。
画出一幅梵高的《星空》
enter image description here
还是什么印象日出的
enter image description here

写完这篇,创建模式的五个都写完了,构建模式也只剩下共享模式和组合模式,同时还有行为模式的五个模式,责任链,纪念品,中介,解释器,访问。

参考资料:

伊夫·克莱因(Yves Klein)不一样的蓝色

热评文章