设计模式系列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)不一样的蓝色相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 学习JavaScript设计模式(接口)
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 面向对象设计模式的核心法则
- JavaScript设计模式之单件模式介绍
- 深入理解JavaScript系列(25):设计模式之单例模式详解