您的位置:首页 > 其它

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

2016-01-04 17:15 501 查看


现在来讲一件很有意思的故事,上面的画很纯洁,只有一种蓝色。但不得不说这图片还是有色差,不能很好的还原实际的色彩,如果有你机会,可以去看下他的
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();
}
}


类图



后记

用弄好的色彩颜料表达出不一样的东西,还是挺有意思的.

我们有了颜料,但如何画,画得如何,就靠个人造诣。

画出一幅梵高的《星空》



还是什么印象日出的



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

参考资料:

伊夫·克莱因(Yves Klein)不一样的蓝色
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 构建者