1.需求

控制
实例个数
例子
在一个Web应用中,只有一个Application对象

2.解决思路

禁用对象创建
隐藏构造函数
提供访问点
使用静态成员
懒加载
使用时,判断没有再创建
避免多线程判断错误
双检查

3.代码示例

				
				
				
				

4.模型图

1.需求

需要创建
大量相似对象
属性是扩展点
需要扩展类的结构
不想重复
创建实例的逻辑
例子
在游戏魔兽争霸中,兵营生产的每个兵种的小兵都是一样的

2.解决思路

复制
直接拷贝现有对象
枚举
每种类型的对象,创建一个原型(用来复制)

3.代码示例

				
				

4.模型图

1.需求

依赖对象是扩展点
创建依赖对象的逻辑需要扩展
不想修改
获取所依赖对象的逻辑(但依赖关系总是变)
例子
在单位食堂,想吃什么就提前定好菜谱

2.解决思路

抽象类
通过类继承,扩展'创建依赖对象的逻辑'
封装对象创建
描述一个对象工厂,专门用于创建所依赖对象

3.代码示例

				
				

4.模型图

1.需求

不想修改
获取所依赖对象的逻辑(但依赖关系总是变)
还要应对
所依赖对象的变化(碰巧它的变化局限在自己的父类下)
例子
在吃货街,想吃什么就找对应的饭馆

2.解决思路

封装对象创建
描述一个对象工厂,专门用于创建所依赖对象
抽象工厂
将工厂抽象,由该系列的工厂创建不同的对象

3.代码示例

				
				

4.模型图

1.需求

不想修改
获取所依赖对象 们 的逻辑(但依赖关系总是变)
不想修改
所依赖对象 之间的组织关系(但它们不是各自独立,非要组织在一起成为一个更大的对象)
还要应对
所依赖对象 们 的变化(碰巧它们的变化局限在自己的父类下)
例子
独立采购食材,选择不同的加工食堂,就可以做出不同口味的菜肴

2.解决思路

封装对象创建
描述一个部件工厂,专门用于创建所依赖的对象 们
封装组合算法
描述一个组装者,将所依赖的对象 们 组织在一起
抽象工厂
将工厂抽象,由该系列的工厂创建不同的对象 们

3.代码示例

				
				

4.模型图

1.总的思路:不直接创建对象,找“某个角色”要对象
2.层层递进:FactoryMethod、AbstractFactory、Builder展示了在现有场景下逐一增加变化点后的解决方案