设计模式笔记感悟 - 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中创建数组主要有两种方式,下面就让我 ...
随机推荐
- kfreebsd不适用于实际环境
debian搞的kfreebsd,其中有很多常用的软件包处于依赖破损的状态,个人觉得是无法用作日常开发或生产环境的. 当然,对于只使用其中几项完整可用功能的场景,基本上还是可以的. 当时看个这个东东的 ...
- Mysql denied for user 'odbc@localhost' || denied for user 'root@localhost'
1. Question Description: 1.1 mysql version: mysql-5.7.11-win64.zip 1.2 if you connect to the mys ...
- python 学习之电脑的发展历史
电脑的发展历史 电脑的学名叫计算机,电脑是用来做计算的.在古时候,人们最早使用的计算工具可能是手指,英文单词“digit”既有“数字”的意思,又有“手指“的意思.古人用石头打猎,所以还有可能是石头来辅 ...
- linux下firefox手工安装flash插件
1. 前往adobe官网,下载flash安装包.下载.tar.gz安装包即可.2. 解压安装包,得到libflashplayer.so文件3. 新建文件夹,~/.mozilla/plugins4. 拷 ...
- SharePoint 2013 术语和术语集介绍
托管元数据是一个集中管理的术语的分层集合,我们可以定义术语和术语集,然后将其用作 SharePoint Server 2013 中项目的属性.简单的说,术语是一个可与 SharePoint Serve ...
- 中国象棋引擎的C#源代码
以前写的中国象棋引擎的C#源程序,可在VS2010中编译运行,由于个人精力有限,难以完成后续的开发工作,如果谁感兴趣,请关注微信公众号(“申龙斌的程序人生”,ID:slbGTD),发送后台消息“象棋引 ...
- Jenkins部署.net自动化构建
1.环境部署: windows server 2008R2环境 2.相关软件 SVN(源代码管理器:jenkins通过插件从源代码管理器下载代码) Jenkins(主角)地址:http://f ...
- UIAlertController弹出提示框
#import "RootViewController.h" #import "RootView.h" #define kColor arc4random() ...
- 【转】IOS高级教程1:处理1000张图片的内存优化
转载请保留以下原文链接: http://my.oschina.net/taptale/blog/91894 一.项目需求 在实际项目中,用户在上传图片时,有时会一次性上传大量的图片.在上传图片前,我们 ...
- 实验:传输层:TCP协议
一.概述 TCP和UDP处在同一层——运输层,但是它们有很多的不同.TCP是TCP/IP系列协议中最复杂的部分,它具有以下特点: (1) TCP提供 可靠的 数据传输服务,TCP是 面向连接的 .应用 ...
