6.特化创建-原型模式(Prototype)+生成器(Builder)
我很深刻的记得我大学的物理老师(男)说过:学习就是以现在的知识为一个点,然后向周围渗透,半径的大小在于你现在的知识还有你的接受能力(应该是指天赋),你不可能跳出这个圈,去学习大于你学习圈的东西的,那是不现实的。 这句话我一直都很认同,知识是慢慢积累的,毕竟我资质愚钝,脚踏实地是最好的学习方法,我觉得这张开始,我就慢慢的去接触我没有接触过的东西了,我不清楚是否在我的学习圈之外(因为很多人和我说过设计模式是很难的东西,即使工作了几年,也未必看懂,何况是我这种菜鸟),不过我相信下次我在研究设计模式的时候,我会获得更深刻的认识,所以这个探讨还是很值得继续下去的。
原型模式(Prototype):
这是一个让我兴奋的事情,因为看起来好像很厉害的样子,而且这本书其实是未完成版的,所以书上并没有解释。其实使用的原因很简单,因为创建一个新的对象可能很耗时间,过程很复杂等等,然后我们就使用原型模式,说白了也就是克隆,这样性能更好(大多数情况下),而且可以对客户端进行创建过程隐藏(这是一个很好的东西),因为java本身就支持,使用实现起来就很简单
class man implements Cloneable{
- public Object clone(){
- Object object = null;
- try {
- object = super.clone();
- } catch (CloneNotSupportedException exception) {
- System.err.println("AbstractSpoon is not Cloneable");
- }
- return object;
- }
不过需要注意的一点是,这里实现的是浅克隆,那么怎么实现深克隆呢,而且两者的区别在哪里呢?
浅克隆就是只是复制了值类型,那么引用类型还是指向m对象的
深克隆就是复制了值类型和引用类型,所以就是相当于新new一个对象。
那么如何深克隆,一个通用的方法就是序列化,man这个类要实现序列化Serializable
然后替换克隆代码就ok了
- public Object deepClone(Object src)
- {
- Object o = null;
- try
- {
- if (src != null)
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(src);
- oos.close();
- ByteArrayInputStream bais = new ByteArrayInputStream(baos
- .toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bais);
- o = ois.readObject();
- ois.close();
- }
- } catch (IOException e)
- {
- e.printStackTrace();
- } catch (ClassNotFoundException e)
- {
- e.printStackTrace();
- }
- return o;
- }
特的生活环境,形成局部器官过于发达的一种特异适应,是分化式进化的特殊情况.例如,马从多趾向单蹄方向发展,爱尔兰鹿有特别发达而沉重的角等,都是特化式进化的结果.生物特化的器官或生理特征都是对特殊的,局部环境高度适应的结果.由于特化生物类型大大缩小了原有的适应范围,所以当环境发生突然的或较大的变化时,往往导致他们的灭绝,成为进化树中的盲枝.
生成器的作用是讲复杂对象的创建化的步骤抽象化,这个复杂对象的含义其实很广,例如你要创建一个网站,那么这个网站就是复杂对象,首先要有网页内容,然后组成网页,然后网页添加到网站里面,然后才生一个网站,你有没有发现这些步骤其实是可以抽象化的,生成器需要用到一个director类,也就是指导这些步骤的进行,它将抽象的步骤放在了里面,我们需要做的就是传一个对象类型进去,然后就会生成出一个复杂对象(可以是网站,可以是电子书,可以是一个软件)
示例
class Media extendeds Arraylist{}
class Website extendeds Media{}
class Book extendeds Media{}
class MediaItem{}
class WebPage extendeds MediaItem{}
class MediaBuilder{
public void buildBase(){}
public void addItem(MediaItem item){}
public Media getFinishedMedia(){return null;}
}
class WebsiteBuilder extendeds MediaBuilder{
private Media m;
public void bulidBase(){
m=new Website();
}
public void addItem(MediaItem item){
m.add(item);
}
public Media getFinishedMedia(){
return m;
}
}
//指导类
class Director{
private MediaBuilder mb;
public Director(MediaBuilder mb){
this.mb=mb;
}
public productMedia(List input){
mb.bulidbase();
for(Iterator it = input.iterator(); it.hasNext();)
mb.addMediaItem((MediaItem)it.next());
return mb.getFinishedMedia();
}
}