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;
- }
}
//测试
man m=new man();
m2=man.clone();
不过需要注意的一点是,这里实现的是浅克隆,那么怎么实现深克隆呢,而且两者的区别在哪里呢?
浅克隆就是只是复制了值类型,那么引用类型还是指向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;
- }
以上就是深克隆的方法
生成器(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等等都跑一遍,熟悉了,也就是架构师了。其实我现在想起来也觉得有点道理,比较更多的知识不是需要你不停的研究啊,像科学家那样,而是需要你熟悉掌握,然后在上面变形创新就已经足够了。好,开始复习算法。准备考试
分享到:
相关推荐
- **设计模式**:介绍常见的设计模式,如工厂模式、单例模式、观察者模式,以及它们在C++中的实现。 - **抽象类与接口**:如何利用抽象类和接口来实现软件的可扩展性和灵活性。 - **访问控制**:理解公有、私有和...
8. 设计模式和最佳实践:作者还会分享一些模板设计模式和最佳实践,帮助读者在实际项目中更好地应用模板。 总之,《Addison.Wesley.C++.Templates-The.Complete.Guide》是深入学习C++模板技术的权威指南,无论你是...
### 知识点生成 #### 一、书目概述与背景 《现代 C++ 设计:泛型编程与设计模式的应用》(Modern C++ Design: Generic Programming and Design Patterns Applied)是一本由 Andrei Alexandrescu 编写的技术书籍,...
6. 显微镜操作 - 为了看清显微镜下的物像,需要调整细准焦螺旋以微调清晰度(问题6)。 7. 显微镜放大倍数 - 放大倍数是目镜和物镜倍数的乘积,若目镜为5倍,要达到50倍,需搭配10倍物镜(问题7)。 8. 显微镜操作...
这一标准源自IEC 61508,经过汽车行业特化,确保在车辆开发过程中实施严谨的安全管理,降低潜在危害。 1. ISO 26262-1 2018:这是标准的总体介绍部分,包含了功能安全的基本概念、目标、范围以及与其他相关标准的...
- 使用`srand(time(0))`种子化随机数生成器,确保每次运行程序时生成不同的随机序列。 - 使用`rand()`生成随机数。 #### 12. 数组与多维数组 - **一维数组**:声明方式为`int arr[];`。 - **多维数组**:声明方式为...
4. 骨骼肌附着骨的模式 - 正确的骨骼肌附着骨的模式关系是肌肉与骨骼的连接方式,试题中可能涉及肌肉的起点和止点。 5. 动物行为 - 杜鹃将卵产在大山雀巢中,利用大山雀喂养幼鸟,这是一种寄生行为,也属于杜鹃的...
此外,还有众多其他行业特化的B2B网站,如服装、纺织、皮革、手表、汽摩配件、电子电气、食品饮料、珠宝等行业,如: - **全球服装网** (http://www.clothingtrade.net/) - **美元贸易** (http://www.tradeusd.com/...
6. 有丝分裂 - DNA与染色体关系:有丝分裂过程中,DNA复制后核内DNA数量加倍,但染色体数量不变,直到后期染色体数目才暂时加倍。细胞质中的DNA分配可能不均匀。 7. ATP - 能量通货:ATP是细胞的能量货币,通过高能...
6. **模板与命名空间**、**作用域**:模板在处理命名空间和作用域时有其特殊性,理解这些规则对于避免名字冲突和提高代码可读性至关重要。 7. **模板与异常安全**:书中还将探讨如何利用模板来编写异常安全的代码,...
6. **模板**:了解泛型编程,包括函数模板和类模板,以及模板特化。 7. **异常处理**:学习如何使用try、catch和throw进行错误处理,以编写健壮的代码。 8. **内存管理**:掌握动态内存分配(new/delete)和智能...
在适当的情况下使用,并且注意模板的特化和偏特化。 预处理器宏应当谨慎使用,因为它们可能导致代码难以理解和调试。现代C++提供了lambda表达式、类型推断(auto关键字)和C++11以后的新特性,如`std::shared_ptr`...
2. 细胞生物学 - 细胞分化:细胞分化是指细胞在形态、结构和功能上的特化,能进行ATP合成和mRNA合成的细胞并未特化,而存在甲状腺激素和纤维蛋白原基因的细胞则表现出特定的功能,是分化的标志。 3. 进化论 - 生物...
在C++ Primer第五版的第9章中,学习者会接触到C++的高级特性,包括模板、函数对象、STL容器、迭代器以及算法。这些习题答案涵盖了从第31题到第46题,旨在帮助读者巩固并深入理解这些主题。下面,我们将详细探讨这些...
这包括函数模板(用于生成函数的通用版本)和类模板(用于生成类的通用版本)。翁凯老师的课件会讲解模板的工作原理、参数推导以及模板特化等高级话题。 4. **STL(Standard Template Library)** STL是C++标准库...
这种方式适用于初始化数组、模板特化或其他需要在编译时确定的场景。 总的来说,C++ 17编译时间字符串哈希是一个强大的工具,它利用了C++的新特性来优化字符串处理。通过使用单头库,开发者可以轻松地将这种功能...
- 在编译时进行计算,利用模板技巧生成代码,以提高运行效率。 - Boost库中的 MPL(Meta Programming Library)是模板元编程的一个强大工具。 6. 模板展开与二义性 - 编译器将模板代码展开为实例化代码,可能...
- 鸟的前肢特化为翅膀,覆盖有大型正羽,适合飞行。 - 鸟的骨骼轻巧且坚固,有些骨内部中空,以减轻体重。胸骨上的龙骨突是强壮胸肌的附着点,提供飞行动力。 4. 生物学 - 动物行为学: - 蚂蚁的信息交流主要...
#### 6. 类模板 - **通用类**:类似于函数模板,但应用于类。 - **模板类实例化**:通过指定类型参数来创建模板类的具体实例。 ### 四、标准模板库(STL) #### 7. 容器 - **顺序容器**:如vector、deque。 - **关联...
#### 6. 异常处理 - **try-catch块**:捕获并处理程序运行时可能发生的异常。 - **throw语句**:抛出异常。 #### 7. STL(Standard Template Library) - **容器**:如vector、list等,用于存储数据。 - **算法**:...