创
建型模式
1
、
FACTORY—
追
MM
少不了
请
吃
饭
了,麦当
劳
的
鸡
翅和肯德基的
鸡
翅都是
MM
爱
吃的
东
西,
虽
然口味有所不同,但不管你
带
MM
去麦当
劳
或肯德基,只管向服
务员说
“
来四个
鸡
翅
”
就行了。麦当
劳
和肯德基就是生
产鸡
翅的
Factory
工厂模式:客
户类
和工厂
类
分
开
。消
费
者任何
时
候需要某
种产
品,只需向工厂
请
求即可。消
费
者无
须
修改就可以接
纳
新
产
品。缺点是当
产
品修改
时
,工厂
类
也要做相
应
的修改。如:如何
创
建及如何向客
户
端提供。
2
、
BUILDER—MM
最
爱
听的就是
“
我
爱
你
”
这
句
话
了,
见
到不同地方的
MM,
要能
够
用她
们
的方言跟她
说这
句
话
哦,我有一个多
种语
言翻
译
机,上面
每种语
言都有一个按
键
,
见
到
MM
我只要按
对应
的
键
,它就能
够
用相
应
的
语
言
说
出
“
我
爱
你
”
这
句
话
了,国外的
MM
也可以
轻
松搞掂,
这
就是我的
“
我
爱
你
”builder
。(
这
一定比美
军
在伊拉克用的
翻
译
机好
卖
)
建造模式:将
产
品的内部表象和
产
品的生成
过
程分割
开
来,从而使一个建造
过
程生成具有不同的内部表象的
产
品
对
象。建造模式使得
产
品内部表象可以独立的
变
化,客
户
不必知道
产
品内部
组
成的
细节
。建造模式可以
强
制
实
行一
种
分
步骤进
行的建造
过
程。
3
、
FACTORY METHOD—
请
MM
去麦当
劳
吃
汉
堡,不同的
MM
有不同的口味,要
每
个都
记
住是一件
烦
人的事情,我一般采用
Factory Method
模式,
带
着
MM
到服
务员
那儿,
说
“
要一个
汉
堡
”
,具体要什
么样
的
汉
堡呢,
让
MM
直接跟服
务员说
就行了。
工厂方法模式:核心工厂
类
不再
负责
所有
产
品的
创
建,而是将具体
创
建的工作交
给
子
类
去做,成
为
一个抽象工厂角色,
仅负责给
出具体工厂
类
必
须实现
的接口,而不接触哪一个
产
品
类应
当被
实
例化
这种细节
。
4
、
PROTOTYPE—
跟
MM
用
QQ
聊天,一定要
说
些深情的
话语
了,我搜集了好多肉麻的情
话
,需要
时
只要
copy
出来放到
QQ
里面就行了,
这
就是我的情
话
prototype
了。(
100
块钱
一份,你要不要)
原始模型模式:通
过给
出一个原型
对
象来指明所要
创
建的
对
象的
类
型,然后用
复
制
这
个原型
对
象的方法
创
建出更多同
类
型的
对
象。原始模型模式允
许动态
的增加或减少
产
品
类
,
产
品
类
不需要非得有任何事先确定的等
级结
构,原始模型模式适用于任何的等
级结
构。缺点是
每
一个
类
都必
须
配
备
一个克隆方法。
5
、
SINGLETON—
俺有
6
个漂亮的老婆,她
们
的老公都是我,我就是我
们
家里的老公
Sigleton
,她
们
只要
说
道
“
老公
”
,都是指的同一个人,那就是我
(
刚
才做了个梦啦,哪有
这么
好的事
)
单
例模式:
单
例模式确保某一个
类
只有一个
实
例,而且自行
实
例化并向整个系
统
提供
这
个
实
例
单
例模式。
单
例模式只
应
在有真正的
“
单
一
实
例
”
的需求
时
才可使用。
结
构型模式
6
、
ADAPTER—
在朋友聚会上碰到了一个美女
Sarah
,从香港来的,可我不会
说
粤
语
,她不会
说
普通
话
,只好求助于我的朋友
kent
了,他作
为
我和
Sarah
之
间
的
Adapter
,
让
我和
Sarah
可以相互交
谈
了
(
也不知道他会不会耍我
)
适配器(
变压
器)模式:把一个
类
的接口
变换
成客
户
端所期待的另一
种
接口,从而使原本因接口原因不匹配而无法一起工作的两个
类
能
够
一起工作。适配
类
可以根据参数返
还
一个合适的
实
例
给
客
户
端。
7
、
BRIDGE—
早上碰到
MM
,要
说
早上好,
晚
上碰到
MM
,要
说晚
上好;碰到
MM
穿了件新衣服,要
说
你的衣服好漂亮哦,碰到
MM
新做的
发
型,要
说
你的
头发
好漂亮哦。不要
问
我
“
早上碰到
MM
新做了个
发
型怎
么说
”
这种问题
,自己用
BRIDGE
组
合一下不就行了
桥
梁模式:将抽象化与
实现
化脱耦,使得二者可以独立的
变
化,也就是
说
将他
们
之
间
的
强关联变
成弱
关联
,也就是指在一个
软
件系
统
的抽象化和
实现
化之
间
使用
组
合
/
聚合
关
系而不是
继
承
关
系,从而使两者可以独立的
变
化。
8
、
COMPOSITE—Mary
今天
过
生日。
“
我
过
生日,你要送我一件礼物。
”“
嗯
,好吧,去商店,你自己挑。
”“
这
件
T
恤挺漂亮,
买
,
这
条裙子好看,
买
,
这
个包
也不
错
,
买
。
”“
喂,
买
了三件了呀,我只答
应
送一件礼物的哦。
”“
什
么
呀,
T
恤加裙子加包包,正好配成一套呀,小姐,麻
烦
你包起来。
”“……”
,
MM
都会用
Composite
模式了,你会了没有?
合成模式:合成模式将
对
象
组织
到
树结
构中,可以用来描述整体与部分的
关
系。合成模式就是一个
处
理
对
象的
树结
构的模式。合成模式把部分与整体的
关
系用
树结
构表示出来。合成模式使得客
户
端把一个个
单
独的成分
对
象和由他
们复
合而成的合成
对
象同等看待。
9
、
DECORATOR—Mary
过
完
轮
到
Sarly
过
生日,
还
是不要叫她自己挑了,不
然
这
个月伙食
费
肯定玩完,拿出我去年在
华
山
顶
上照的照片,在背面写上
“
最好的的礼物,就是
爱
你的
Fita”
,再到街上礼品店
买
了个像框(
卖
礼品的
MM
也很漂亮哦),再找隔壁搞美
术设计
的
Mike
设计
了一个漂亮的盒子装起来
……
,我
们
都是
Decorator
,最
终
都在修
饰
我
这
个人呀,怎
么样
,看懂了
吗
?
装
饰
模式:装
饰
模式以
对
客
户
端透明的方式
扩
展
对
象的功能,是
继
承
关
系的一个替代方案,提供比
继
承更多的灵活性。
动态给
一个
对
象增加功能,
这
些功能可以再
动态
的撤消。增加由一些基本功能的排列
组
合而
产
生的非常大量的功能。
10
、
FACADE—
我有一个
专业
的
Nikon
相机,我就喜
欢
自己手
动调
光圈、快
门
,
这样
照出来的照片才
专业
,但
MM
可不懂
这
些,教了半天也不会。幸好相机有
Facade
设计
模式,把相机
调
整到自
动
档,只要
对
准目
标
按快
门
就行了,一切由相机自
动调
整,
这样
MM
也可以用
这
个相机
给
我拍
张
照片了。
门
面模式:外部与一个子系
统
的通信必
须
通
过
一个
统
一的
门
面
对
象
进
行。
门
面模式提供一个高
层
次的接口,使得子系
统
更易于使用。
每
一个子系
统
只有一个
门
面
类
,而且此
门
面
类
只有一个
实
例,也就是
说
它是一个
单
例模式。但整个系
统
可以有多个
门
面
类
。
11
、
FLYWEIGHT—
每
天跟
MM
发
短信,手指都累死了,最近
买
了个新手机,可以把一些常用的句子存在手机里,要用的
时
候,直接拿出来,在前面加上
MM
的名字就可以
发
送了,再不用一个字一个字敲了。共享的句子就是
Flyweight
,
MM
的名字就是提取出来的外部特征,根据上下文情况使用。
享元模式:
FLYWEIGHT
在拳
击
比
赛
中指最
轻
量
级
。享元模式以共享的方式高效的支持大量的
细
粒度
对
象。享元模式能做到共享的
关键
是区分内
蕴
状
态
和外
蕴
状
态
。内
蕴
状
态
存
储
在享元内部,不会随
环
境的改
变
而有所不同。外
蕴
状
态
是随
环
境的改
变
而改
变
的。外
蕴
状
态
不能影响内
蕴
状
态
,它
们
是相互独立的。将可以共享的状
态
和不可以共享的状
态
从常
规类
中区分
开
来,将不可以共享的状
态
从
类
里剔除出去。客
户
端不可以直接
创
建被共享的
对
象,而
应
当使用一个工厂
对
象
负责创
建被共享的
对
象。享元模式大幅度的降低内存中
对
象的数量。
12
、
PROXY—
跟
MM
在网上聊天,一
开头总
是
“hi,
你好
”,“
你从哪儿来呀?
”“
你多大了?
”“
身高多少呀?
”
这
些
话
,真
烦
人,写个程序做
为
我的
Proxy
吧,凡是接收到
这
些
话
都
设
置好了自
动
的回答,接收到其他的
话时
再通知我回答,怎
么样
,酷吧。
代理模式:代理模式
给
某一个
对
象提供一个代理
对
象,并由代理
对
象控制
对
源
对
象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行
动
。某些情况下,客
户
不想或者不能
够
直接引用一个
对
象,代理
对
象可以在客
户
和目
标对
象直接起到中介的作用。客
户
端分辨不出代理主
题对
象与真
实
主
题对
象。代理模式可以并不知道真正的被代理
对
象,而
仅仅
持有一个被代理
对
象的接口,
这时
候代理
对
象不能
够创
建被代理
对
象,被代理
对
象必
须
有系
统
的其他角色代
为创
建并
传
入。
行
为
模式
13
、
CHAIN OF RESPONSIBLEITY—
晚
上去上英
语课
,
为
了好
开
溜坐到了最后一排,哇,前面坐了好几个漂亮的
MM
哎,找
张纸
条,写上
“Hi,
可以做我的女朋友
吗
?如果不愿意
请
向前
传
”
,
纸
条就一个接一个的
传
上去了,糟糕,
传
到第一排的
MM
把
纸
条
传给
老
师
了,听
说
是个老
处
女呀,快跑
!
责
任
链
模式:在
责
任
链
模式中,很多
对
象由
每
一个
对
象
对
其下家的引用而接
起来形成一条
链
。
请
求在
这
个
链
上
传递
,直到
链
上的某一个
对
象决定
处
理此
请
求。客
户
并不知道
链
上的哪一个
对
象最
终处
理
这
个
请
求,系
统
可以在不影响客
户
端的情况下
动态
的重新
组织链
和分配
责
任。
处
理者有两个
选择
:承担
责
任或者把
责
任推
给
下家。一个
请
求可以最
终
不被任何接收端
对
象所接受。
14
、
COMMAND—
俺有一个
MM
家里管得特
别严
,没法
见
面,只好借助于她弟弟在我
们俩
之
间传
送信息,她
对
我有什
么
指示,就写一
张纸
条
让
她弟弟
带给
我。
这
不,她弟弟又
传
送
过
来一个
COMMAND
,
为
了感
谢
他,我
请
他吃了碗
杂酱
面,哪知道他
说
:
“
我同
时给
我姐姐三个男朋友送
COMMAND
,就数你最小气,才
请
我吃面。
”
,
:-(
命令模式:命令模式把一个
请
求或者操作封装到一个
对
象中。命令模式把
发
出命令的
责
任和
执
行命令的
责
任分割
开
,委派
给
不同的
对
象。命令模式允
许请
求的一方和
发
送的一方独立
开
来,使得
请
求的一方不必知道接收
请
求的一方的接口,更不必知道
请
求是怎
么
被接收,以及操作是否
执
行,何
时
被
执
行以及是怎
么
被
执
行的。系
统
支持命令的撤消。
15
、
INTERPRETER—
俺有一个《泡
MM
真
经
》,上面有各
种
泡
MM
的攻略,比如
说
去吃西餐的
步骤
、去看
电
影的方法等等,跟
MM
约
会
时
,只要做一个
Interpreter
,照着上面的脚本
执
行就可以了。
解
释
器模式:
给
定一个
语
言后,解
释
器模式可以定
义
出其文法的一
种
表示,并同
时
提供一个解
释
器。客
户
端可以使用
这
个解
释
器来解
释这
个
语
言中
的句子。解
释
器模式将描述怎
样
在有了一个
简单
的文法后,使用模式
设计
解
释这
些
语
句。在解
释
器模式里面提到的
语
言是指任何解
释
器
对
象能
够
解
释
的任何
组
合。在解
释
器模式中需要定
义
一个代表文法的命令
类
的等
级结
构,也就是一系列的
组
合
规则
。
每
一个命令
对
象都有一个解
释
方法,代表
对
命令
对
象的解
释
。命令
对
象的等
级结
构中的
对
象的任何排列
组
合都是一个
语
言。
16
、
ITERATOR—
我
爱
上了
Mary
,不
顾
一切的向她求婚。
Mary
:
“
想要我跟你
结
婚,得答
应
我的条件
”
我:
“
什
么
条件我都答
应
,你
说
吧
”
Mary
:
“
我看上了那个一克拉的
钻
石
”
我:
“
我
买
,我
买
,
还
有
吗
?
”
Mary
:
“
我看上了湖
边
的那
栋别
墅
”
我:
“
我
买
,我
买
,
还
有
吗
?
”
Mary
:
“
你的小弟弟必
须
要有
50cm
长
”
我
脑
袋
嗡
的一声,坐在椅子上,一咬牙:
“
我剪,我剪,
还
有
吗
?
”
……
迭代子模式:迭代子模式可以
顺
序
访问
一个聚集中的元素而不必暴露聚集的内部表象。多个
对
象聚在一起形成的
总
体称之
为
聚集,聚集
对
象是能
够
包容一
组对
象的容器
对
象。迭代子模式将迭代
逻辑
封装到一个独立的子
对
象中,从而与聚集本身隔
开
。迭代子模式
简
化了聚集的界面
。
每
一个聚集
对
象都可以有一个或一个以上的迭代子
对
象,
每
一个迭代子的迭代状
态
可以是彼此独立的。迭代算法可以独立于聚集角色
变
化。
17
、
MEDIATOR—
四个
MM
打麻将,相互之
间谁应该给谁
多少
钱
算不清楚了,幸
亏
当
时
我在旁
边
,按照各自的
筹码
数算
钱
,
赚
了
钱
的从我
这
里拿,
赔
了
钱
的也付
给
我,一切就
OK
啦,俺得到了四个
MM
的
电话
。
调
停者模式:
调
停者模式包装了一系列
对
象相互作用的方式,使得
这
些
对
象不必相互明
显
作用。从而使他
们
可以松散偶合。当某些
对
象之
间
的作用
发
生改
变时
,不会立即影响其他的一些
对
象之
间
的作用。保
证这
些作用可以彼此独立的
变
化。
调
停者模式将多
对
多的相互作用
转
化
为
一
对
多的相互作用。
调
停者模式将
对
象的行
为
和
协
作抽象化,把
对
象在小尺度的行
为
上与其他
对
象的相互作用分
开处
理。
18
、
MEMENTO—
同
时
跟几个
MM
聊天
时
,一定要
记
清楚
刚
才跟
MM
说
了些什
么话
,不然
MM
发现
了会不高
兴
的哦,幸
亏
我有个
备
忘
录
,
刚
才与哪个
MM
说
了什
么话
我都拷
贝
一份放到
备
忘
录
里面保存,
这样
可以随
时
察看以前的
记录
啦。
备
忘
录
模式:
备
忘
录对
象是一个用来存
储
另外一个
对
象内部状
态
的快照的
对
象。
备
忘
录
模式的用意是在不破坏封装的条件下,将一
个
对
象的状
态
捉住,并外部化,存
储
起来,从而可以在将来合适的
时
候把
这
个
对
象
还
原到存
储
起来的状
态
。
19
、
OBSERVER—
想知道咱
们
公司最新
MM
情
报吗
?加入公司的
MM
情
报邮
件
组
就行了,
tom
负责
搜集情
报
,他
发现
的新情
报
不用一个一个通知我
们
,直接
发
布
给邮
件
组
,我
们
作
为订阅
者(
观
察者)就可以及
时
收到情
报
啦
观
察者模式:
观
察者模式定
义
了一
种
一
队
多的依
赖关
系,
让
多个
观
察者
对
象同
时监
听某一个主
题对
象。
这
个主
题对
象在状
态
上
发
生
变
化
时
,会通知所有
观
察者
对
象,使他
们
能
够
自
动
更新自己。
20
、
STATE—
跟
MM
交往
时
,一定要注意她的状
态
哦,在不同的状
态时
她的行
为
会有不同,比如你
约
她今天
晚
上去看
电
影,
对
你没
兴
趣的
MM
就会
说
“
有事情啦
”
,
对
你不
讨厌
但
还
没喜
欢
上的
MM
就会
说
“
好啊,不
过
可以
带
上我同事
么
?
”
,已
经
喜
欢
上你的
MM
就会
说
“
几点
钟
?看完
电
影再去泡吧怎
么样
?
”
,当然你看
电
影
过
程中表
现
良好的
话
,也可以把
MM
的状
态
从不
讨厌
不喜
欢变
成喜
欢
哦。
状
态
模式:状
态
模式允
许
一个
对
象在其内部状
态
改
变
的
时
候改
变
行
为
。
这
个
对
象看上去象是改
变
了它的
类
一
样
。状
态
模式把所研究的
对
象的行
为
包装在不同的状
态对
象里,
每
一个状
态对
象都属于
一个抽象状
态类
的一个子
类
。状
态
模式的意
图
是
让
一个
对
象在其内部状
态
改
变
的
时
候,其行
为
也随之改
变
。状
态
模式需要
对每
一个系
统
可能取得的状
态创
立一个状
态类
的子
类
。当系
统
的状
态变
化
时
,系
统
便改
变
所
选
的子
类
。
21
、
STRATEGY—
跟不同
类
型的
MM
约
会,要用不同的策略,有的
请电
影比
较
好,有的
则
去吃小吃效果不
错
,有的去海
边
浪漫最合适,
单
目的都是
为
了得到
MM
的芳心,我的追
MM
锦
囊中有好多
Strategy
哦。
策略模式:策略模式
针对
一
组
算法,将
每
一个算法封装到具有共同接口的独立的
类
中,从而使得它
们
可以相互替
换
。
策略模式使得算法可以在不影响到客
户
端的情况下
发
生
变
化。策略模式把行
为
和
环
境分
开
。
环
境
类负责维
持和
查询
行
为类
,各
种
算法在具体的策略
类
中提供。由于算法和
环
境独立
开
来,算法的增减,修改都不会影响到
环
境和客
户
端。
22
、
TEMPLATE METHOD——
看
过
《如何
说
服女生上床》
这
部
经
典文章
吗
?女生从
认识
到上床的不
变
的
步骤
分
为
巧遇、打破僵局、展
开
追求、接吻、前
戏
、
动
手、
爱抚
、
进
去八大
步骤
(Template method)
,但
每
个
步骤针对
不同的情况,都有不一
样
的做法,
这
就要看你随机
应变
啦
(
具体
实现
)
;
模板方法模式:模板方法模式准
备
一个抽象
类
,将部分
逻辑
以具体方法以及具体构造子的形式
实现
,然后声明一些抽象方法来迫使子
类实现
剩余的
逻辑
。不同的子
类
可以以不同的方式
实现这
些抽象方法,从而
对
剩余的
逻辑
有不同的
实现
。先制定一个
顶级逻辑
框架,而将
逻辑
的
细节
留
给
具体的子
类
去
实现
。
23
、
VISITOR—
情人
节
到了,要
给每
个
MM
送一束
鲜
花和一
张
卡片,可是
每
个
MM
送的花都要
针对
她个人的特点,
每张
卡片也要根据个人的特点来挑,我一个人哪搞得清楚,
还
是找花店老板和礼品店老板做一下
Visitor
,
让
花店老板根据
MM
的特点
选
一束花
,
让
礼品店老板也根据
每
个人特点
选
一
张
卡,
这样
就
轻
松多了;
访问
者模式:
访问
者模式的目的是封装一些施加于某
种
数据
结
构元素之上的操作。一旦
这
些操作需要修改的
话
,接受
这
个操作的数据
结
构可以保持不
变
。
访问
者模式适用于数据
结
构相
对
未定的系
统
,它把数据
结
构和作用于
结
构上的操作之
间
的耦合解脱
开
,使得操作集合可以相
对
自由的演化。
访问
者模式使得增加新的操作
变
的很容易,就是增加一个新的
访问
者
类
。
访问
者模式将有
关
的行
为
集中到一个
访问
者
对
象中,而不是分散到一个个的
节
点
类
中。当使用
访问
者模式
时
,要将尽可能多的
对
象
浏览逻辑
放在
访问
者
类
中,而不是放到它的子
类
中。
访问
者模式可以跨
过
几个
类
的等
级结
构
访问
属于不同的等
级结
构的成
员类