设计模式笔记感悟 - Creational篇
body,td,p { // 这对大括号里描述网页的背景
margin-left:40px;
margin-right:40px;
font-size: 10pt;
}
div.vim { width:800px, font-family: monospace; color: #ffffff; background-color: #333333; }
.lnr { color: #ffff00; }
.constant { color: #ffa0a0; }
.identifier { color: #98fb98; }
.comment { color: #87ceeb; }
div.cnblogs_code
{
width:800px;
}
h1 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 26px;
font-weight: bold;
color: #820918;
}
h2 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 20px;
font-weight: bold;
color: #820918;
}
h3 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 16px;
font-weight: bold;
color: #820918;
}
h4 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 16px;
font-weight: bold;
color: #820918;
}
h5 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 14px;
font-weight: bold;
color: #820918;
}
h6 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 12px;
font-weight: bold;
color: #820918;
}
h7 { // 这对大括号里描述 标签中的部分
font-family: 华文细黑;
font-size: 10px;
font-weight: bold;
color: #820918;
}
b,strong
{
color: #820918;
}
1. Prototype Pattern ( 原型模式 )

关键:
继承 ICanClone 接口.
理解:
原型实例从语法上看是一个对象(实例), 但是从功能上看是一个类 -- 当我们实现了一个原型( 即一个原型对象 ), 便可以利用 clone() 函数构造出无数个 跟这个原型的行为方式一模一样的实例. 这不就是 new Class() 的功能么?
clone() 与 new Class() 不同的是: 类是在编译过程之前定义的, 其行为方式在编译之后很难改变. 而原型对象的行为方式可以通过配置子组件, 设置参数来改变, 所以更加灵活.
注意:
对象内部有循环引用
clone() 函数的实现.
2. Abstract Factory ( 抽象工厂模式 )

关键:
产品族

理解:
具体类的创建代码不会在客户端程序中. 更方便的替换大量具体类.
一个具体抽象工厂类对应着一个产品族. 不用关心产品族下面的实现, 只调用抽象工厂类的公共方法.
3. Factory Method( 工厂方法模式 )

关键:
用 createProduct():IProduct 来代替 new Product();
理解:
1. “Creating objects inside a class with a factory method is always more flexible than creating an object directly” – < Design Patterns – GoF >
createProduct():IProduct 方法可以被继承来改变"生产"出来的具体Product. 而 new Product() 方法是硬代码, 无法通过继承来修改具体返回Product.
如果我们需要换掉原来的Product具体类而使用新的 Product具体类, 一般有两种方式: 一种是继承原来的 creater 类, 覆盖createProduct()方法; 第二种是直接修改 creater 的 createProduct() 方法.
不管使用哪种方式, 与 new Product() 方式相比, 工厂方法都能减小对源代码的修改.
2. 当有平行类结构的时候, 工厂方法一般很受欢迎.
|
Parallel Class Hierarchies When you have two set of classes that mirror each others structures.Examples occur all over the place in code, typically when you have a catalog of items, and you then have instances of those items used in specific situations. The two class hierarchies are typically Homomorphic, that is they share the same structure.For example, I have a blueprint for a widget that is made up of a gadget connected to a sprocket. I then make one. I now have a real widget, and in that widget my actual gadget is connected to a real sprocket. Not only are the parts mirrored, but the relationships are as well.I could say this a bit more formally: Suppose I have a hierarchy, C, of two classes x and y that have a function, f, such that f(x)=y. Now another parallel hierarchy, C', with two classes x' and y' is Homomorphic if it has a function, f', such that f'(x')=y'.I have a sneaking suspicion that this could all be said very elegantly in CategoryTheory, but I'm not sure how to formulate it.DanielPoon |
4. Builder ( 构建者模式 )

关键:
Builder 只关心Part 的构建, 不关心 Part 的组合.
理解:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式;
Builder 模式是为了更灵活的实现这个公式:
Product = n1*Part1 + n2*Part2 + ... + nm*Partm( 这里 m 一般是个固定的数, 即 AbstractBuilder 内的方法数是固定的, 又即AbstractBuilder 接口是相对固定的 ).
Product 的改变取决于三方面: 一是 [ n1, n2, ... nm ] 参数取值不同; 二是 [ Part1, Part2, ... , Partm ] 顺序不同; 三是 PartX 本身的实现不同.
前两个不同在 Director中实现. 第三个不同通过构建新的 ConcreteBuilder 来实现.
|
Builder核心思想: 将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。 抽象的Builder类,为导向者可能要求创建的每一个构件(Part)定义一个操作(接口)。这些操作缺省情况下什么都不做。一个ConcreteBuilder类对它所感兴趣的构建重定义这些操作。每个ConcreteBuilder包含了创建和装配一个特定产品的所有代码(注意:ConcreteBuilder只是提供了使用部件装配产品的操作接口,但不提供具体的装配算法,装配算法在导向器[Director]中定义)。这些代码只需要写一次;然后不同的Director可以复用它,以在相同部件集合的基础上构建不同的Product。 引自: http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html |
5. Singleton ( 单例模式 )

关键:
全局访问, 唯一实例
理解:
此模式相对简单, 略
设计模式笔记感悟 - Creational篇的更多相关文章
- AngularJS in Action读书笔记6(实战篇)——bug hunting
这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:函数“可变长参数”
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Sed&awk笔记之sed篇
http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
随机推荐
- java初始化构造函数调用顺序
类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值: (2)调用父类构造函数: (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式: (4)调用本身构造函数. 例子 ...
- PHP学习笔记:万能随机字符串生成函数(已经封装好)
做验证码用到的,然后就把这个函数封装起来,使用时候要设置2个参数: $str设置里要被采集的字符串,比如: $str='efasfgzsrhftjxjxjhsrth'; 则在函数里面生成的字符串就回从 ...
- 每一个成功的程序员的身后都有一个--------Parse
相信好多同行都用过Parse,而正是因为Parse给我们的开发带来的极大的便利,才有了项目从零开始,到正式上线仅仅用上不到两周的时间,现在Swift还在迅速的发展,很快就会占有大量的市场,现在就就结合 ...
- 为阿里云存储开发的PHP PEAR 包:Services_Aliyun_OSS
阿里云开放存储服务 OSS:用于存储图片.apk等静态资源,使用阿里云带宽,不占用开发者服务器带宽. 阿里云官方PHP SDK: http://aliyun.com/product/oss/#help ...
- IOS6学习笔记(四)
1.GCD设置一个timer计时器 - (void)awakeFromNib { __weak id weakSelf = self; double delayInSeconds = 0.25; _t ...
- Oauth笔记
上周的工作有安全验证这一块,但不懂,只知道有几个关键字Oauth.secret-key .token.签名等.今天就查下资料做笔记. Oauth是什么 不依靠用户账号和密码就能获得访问资源权限 本质: ...
- 如何rename sqlserver database
Problem Sometimes there is a need to change the name of your database whether this is because the or ...
- Android Service获取当前位置(GPS+基站)
需求详情:1).Service中每隔1秒执行一次定位操作(GPS+基站)2).定位的结果实时显示在界面上(要求得到经度.纬度)技术支持:1).获取经纬度通过GPS+基站获取经纬度,先通过GPS来获取, ...
- Java反射中的getClass()方法
Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代 ...
- SharePoint Tricks - Survey
1. SharePoint 2010中,在Survey的问题框中输入HTML代码可以用于插入图片或者链接,具体方法为: 1.1 在问题框中输入html, 1.2 在New Form和Edit Form ...
