抽象工厂模式
封装变化点
动机
在软件系统中,经常面临着“一系列相互依赖的对象 ”的创建工作,同行四,由于需求的变化,往往存在更多系列对象的创建工作
如果不是多系列 ,则简单工厂(静态工厂)可以解决.
例如: 体育协会(工厂)负责创建运动员(包括篮球运动员,足球运动员...)
简单工厂
实现: 体育协会(工厂) 根据传入的运动员type,直接返回抽象运动员
抽象工厂
实现: 篮球协会(工厂), 足球协会(工厂)继承体育协会(抽象工厂),篮球协会负责创建篮球运动员,足球协会负责创建足球运动员...
如果需要再加入(或扩展)产品类(比如加多个“乒乓球运动员”)的话就不再需要修改工厂类了-"OCP(开闭原则,Open-Closed Principle" ,而只需相应的再添加一个实现了工厂接口(“体育协会”接口)的具体工厂类。
http://blog.youkuaiyun.com/woolceo/archive/2005/10/19/509180.aspx
Proxy 模式
增加一层间接层,是软件系统中对许多复杂问题的一种常见方法
意图
为其他对象提供一中代理以控制对这个对象的访问
动机
在面向系统中,有些对象由于某种原因,直接访问会给使用者,或者系统结构带来麻烦
模式
在不失去透明操所对象的同时来管理/控制这些对象特有的复杂性
经典例子:
1. DataAccess Level - 使得业务逻辑层更加清晰,不用参杂SQL语句
2. WebSerive- 利用web服务代理类,像访问本地类一样访问web service
3. Copy on write - StringBuilder vs. string
string- c#,java 中,不允许修改字符串而是创建一个新的,因为相同值字符串 指 向同一个地址空间
StringBuilder - (代理),相同值字符串 指 向同一个地址空间, 但如果有修改,则
1)copy原来有的字符串到新的地址
2)在新的地址对字符串修改
代码实例:
interface IEmployee
{
public void GetSalary();
}
class Employee: IEmployee
{
public void GetSalary(){...};
}
class HrSystem
{
public void Process()
{
Employee a=new Employee();
}
}
前提:Employee class 与HrSystem class在同一个地址空间,同一个进程
当Employee 位于其他地址(或server或者web service)。我们可以引入代理:
代理:
class EmployeeProxy: IEmployee
{
public EmployeeProxy()
{
//对象创建/访问的一种SOAP封装
}
public void GetSalary()
{
//对象访问的一种SOAP封装
// 发送SOAP数据
//接受返回值
}
}
class HrSystem
{
public void Process()
{
IEmployee a=new EmployeeProxy();
}
}
Template Method 模式
设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化点和稳定点,并使用特定的设计方法来应对变化
意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
动机
在软件构建过程中,对于某一项任务,它常常又稳定的整体操作结构,但各个子步骤却有很多改变得需求,或者由于固有的原因(比如
框架与应用只见的关系)而无法和任务的整体结构同时实现
-稳定的东西实现早(框架),不稳定的东西实现晚,也即晚绑定,扩展点
Observer 模式
优化依赖,改善抵御变化的影响
依赖倒置- 细节依赖抽象,具体依赖抽象,不稳定依赖稳定的 - 软件体系松耦合
意图
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
动机
在软件构建过程中,我们需要对某些对象建立一中“通知依赖关系”-一个对象(目标对象)的状态发生改变,所有的依赖对象
(观察者对象)都将得到通知,如果这样那个的依赖关系过于紧密,将使软件不能很好的抵御变化