`
abcxo
  • 浏览: 32405 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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
5
分享到:
评论

相关推荐

    难得C++全栈!侯捷老师C++天龙八部合集+专业辅导 C++技能超级实战+算法实践+系统设计

    03.侯捷 - C++设计模式 04.侯捷 - C++新标准C++11&14 05.侯捷 - C++内存管理机制_60_侯捷 06.侯捷 C++ Startup 揭密:C++ 程序的生前和死后 07.算法原理与实践(选修) 08.系统设计与实践(选修) 09.辅导课 ...

    函数模板完全特化 C++ Builder 示例

    函数模板完全特化 C++ Builder 示例 代码参考: 余文溪的《C++ STL --数据结构与算法实现》原书代码为控制台。 这里用 C++ Builder代码演示

    C++必知必会【可搜索+可编辑/复制/粘贴+无密码】

    条款29 虚构造函数与Prototype 模式………….... …·…..... ….. ……..... ……... …… .77 条款30 Factory Method模式......................................................................... 79 条款31 ...

    类模板完全特化 C++ Builder演示

    编译环境: Windows 7 Service Pack 1 C++ Builder Embarcadero RAD Studio XE Version 15.0.3890.34076 代码参考: 余文溪的《C++ STL --数据结构与算法实现》原书代码为控制台。 这里用 C++ Builder代码演示

    区域分析与规划-广东省各市特化系数.xlsx

    某一部门在地区专业化中的地位以及在全省的地位时采用特化系数分析。亦称区位系数或者特化指数。当LQ=1,说明该地区这一部门人口处于省平均状态;当LQ>1,说明该地区这一部门人口相对集中,处于省特化状态;当LQ,...

    C++模版特化

    说起C++的模板及模板特化, 相信很多人都很熟悉,但是说到模板特化的几种类型, 相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一 是特化为绝对类型; 二是特化为引用,指针类型;...

    数组特化模板类

    泛型容器的设计实现大多只是存储了类型的单个对象,而没有存储类型的多个对象,如果有这样特定的需求,容器内的元素要求都是某个类型的多个对象,那么这时就可以考虑用模板类的数组特化来实现了

    深入分析C++模板特化与偏特化

    1.模板特化 1.1概述 模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。 1.2函数...

    Mori:脚本可以扫描json-api,主要用于蜘蛛

    )扩展代理调用方法()添加强校验模式添加发送邮件选项( )特化代理添加traceback添加注释对--verbose输出上色对代理进行验证( )安装# installation$ git@github.com:zxjlm/Mori.git$ cd Mori$ pip install -r ...

    Redis/MongoDB 接口封装(C++)

    6. 用 Perl 开发自动代码生成器,上层程序员对照数据库表结构写 .tmpl 配置文件, 自动生成该数据库表的 MongodbModule 子类,减轻程序员新增表时的工作量 7. 结合 Redis 模块和 MongoDB 模块,开发 ...

    C++模板之特化与偏特化详解

    我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然不利于程序的扩充和维护。C++模板就应运而生。C++的模板提供了对逻辑结构相同的

    模板的 主版本模板类、全特化、偏特化

    模板的 主版本模板类、全特化、偏特化

    大数据-算法-组合优化问题的特化与泛化算法设计.pdf

    大数据-算法

    FunctionDou#STL#8 全特化和偏特化1

    前言关于讲过traits萃取器的时候探讨到偏特化的概念, 而在那一篇文章也没有具体解释偏特化是什么, 怎么实现, 所以可能在第一次看得时候会很莫名其妙. 所以我

    网二维数组的动态创建和释放.pdf 网负号重载(1).pdf 网负号重载pdf 赋值号“==“重载(1).pdf 赋值号"==

    网二维数组的动态创建和释放.pdf 网负号重载(1).pdf 网负号重载pdf 赋值号“==“重载(1).pdf 赋值号"== “重载.pdf 构造函数可以调用虚函数吗, 析构函数可... 后置加加(1).pdf 后置加加.pdf 网将模板声明为友元.pdf ...

    C++ 类模板、函数模板全特化、偏特化的使用

    一、类模板全特化、偏特化 #pragma once #include #include template class TC { public: TC() { std::cout << "泛化版本构造函数" < class TC { public: TC() { std::cout << "全特化版本...

    C++模板特化匹配规则

    C++模板特化匹配规则

    编程新手真言......

    8.19 真正的迭代器模式 186 8.20 真正的工厂模式 187 8.21 真正的门面模式 187 8.22 真正的命令模式 188 8.23 真正的模板方法模式 188 8.24 真正的适配器模式 188 8.25 业务与逻辑分开 189 8.26 架构不是功能的要求...

    朱老师C++课程第3部分3.4.模板特化与类型萃取

    涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制...

Global site tag (gtag.js) - Google Analytics