6.特化创建-原型模式(Prototype)+生成器(Builder)

6.特化创建-原型模式(Prototype)+生成器(Builder)

 

我很深刻的记得我大学的物理老师(男)说过:学习就是以现在的知识为一个点,然后向周围渗透,半径的大小在于你现在的知识还有你的接受能力(应该是指天赋),你不可能跳出这个圈,去学习大于你学习圈的东西的,那是不现实的。   这句话我一直都很认同,知识是慢慢积累的,毕竟我资质愚钝,脚踏实地是最好的学习方法,我觉得这张开始,我就慢慢的去接触我没有接触过的东西了,我不清楚是否在我的学习圈之外(因为很多人和我说过设计模式是很难的东西,即使工作了几年,也未必看懂,何况是我这种菜鸟),不过我相信下次我在研究设计模式的时候,我会获得更深刻的认识,所以这个探讨还是很值得继续下去的。

 

 

 

 

原型模式(Prototype):

这是一个让我兴奋的事情,因为看起来好像很厉害的样子,而且这本书其实是未完成版的,所以书上并没有解释。其实使用的原因很简单,因为创建一个新的对象可能很耗时间,过程很复杂等等,然后我们就使用原型模式,说白了也就是克隆,这样性能更好(大多数情况下),而且可以对客户端进行创建过程隐藏(这是一个很好的东西),因为java本身就支持,使用实现起来就很简单

 

class  man implements Cloneable{

  1. public Object clone(){  
  2.     Object object = null;  
  3.     try {  
  4.       object = super.clone();  
  5.     } catch (CloneNotSupportedException exception) {  
  6.       System.err.println("AbstractSpoon is not Cloneable");  
  7.     }  
  8.    return object;  
  9.   }  
}
//测试

man m=new man();
m2=man.clone();

 

不过需要注意的一点是,这里实现的是浅克隆,那么怎么实现深克隆呢,而且两者的区别在哪里呢?

浅克隆就是只是复制了值类型,那么引用类型还是指向m对象的

深克隆就是复制了值类型和引用类型,所以就是相当于新new一个对象。

那么如何深克隆,一个通用的方法就是序列化,man这个类要实现序列化Serializable

然后替换克隆代码就ok了

  1.  public Object deepClone(Object src)
  2.     {
  3.         Object o = null;
  4.         try
  5.         {
  6.             if (src != null)
  7.             {
  8.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  9.                 ObjectOutputStream oos = new ObjectOutputStream(baos);
  10.                 oos.writeObject(src);
  11.                 oos.close();
  12.                 ByteArrayInputStream bais = new ByteArrayInputStream(baos
  13.                         .toByteArray());
  14.                 ObjectInputStream ois = new ObjectInputStream(bais);
  15.                 o = ois.readObject();
  16.                 ois.close();
  17.             }
  18.         } catch (IOException e)
  19.         {
  20.             e.printStackTrace();
  21.         } catch (ClassNotFoundException e)
  22.         {
  23.             e.printStackTrace();
  24.         }
  25.         return o;
  26.     }

以上就是深克隆的方法






生成器(Builder):
这是一个很有趣的模式,因为很多时候看起来你可以说是很工厂模式很像,又或者是状态模式的复杂版,或者是策略模式,之前我也说过在众多模式的某些实现上。看起来他们好像是完全相同的,但是其实不然,我们要抓住他们的思想精髓,对于这个模式面对的问题是什么呢?


特化是由一般到特殊的生物进化方式.指物种适应于某一独
   特化

特化

特的生活环境,形成局部器官过于发达的一种特异适应,是分化式进化的特殊情况.例如,马从多趾向单蹄方向发展,爱尔兰鹿有特别发达而沉重的角等,都是特化式进化的结果.生物特化的器官或生理特征都是对特殊的,局部环境高度适应的结果.由于特化生物类型大大缩小了原有的适应范围,所以当环境发生突然的或较大的变化时,往往导致他们的灭绝,成为进化树中的盲枝.

 

 

 

生成器的作用是讲复杂对象的创建化的步骤抽象化,这个复杂对象的含义其实很广,例如你要创建一个网站,那么这个网站就是复杂对象,首先要有网页内容,然后组成网页,然后网页添加到网站里面,然后才生一个网站,你有没有发现这些步骤其实是可以抽象化的,生成器需要用到一个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();

}

}

其实过程就是很简单理解的,就是每个Media都有自己需要的配件创建方法(创建配件的,什么add啊那些),然后最后需要一个Director类,将这些创建配件的方法组合起来,就形成了一个抽象的步骤,然后就可以完成一个复杂对象的创建了。




无论是干什么事情,我们首先在心里面不能被打败,不要认为好难就不去做,要有一种挑战的心理(不过我有时候太喜欢高难度了,但是我的水平又经常没有达到,比如说玩fifa这样,老是选世界级的,哎,所以经常使自己很沮丧),当理解了, 其实也就那东西了,我想起了一个老程序员对我说的话(50多岁可能),其实架构师也就那回事,把那些工具mysql,j2ee,oracle等等都跑一遍,熟悉了,也就是架构师了。其实我现在想起来也觉得有点道理,比较更多的知识不是需要你不停的研究啊,像科学家那样,而是需要你熟悉掌握,然后在上面变形创新就已经足够了。好,开始复习算法。准备考试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值