工厂
简单工厂

简单工厂就是根据传入不同的参数,生成不同类的实例,不同的实例继承自同一个基类,通过多态统一调用方法。
工厂方法模式

工厂方法从一开始就需要选择创建的这个物体的专属工厂,它们都继承自同个接口,每个工厂生产专属的类实例。
简单工厂vs工厂方法
简单工厂的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关的类,对客户端来说去除了与具体类的依赖。而工厂方法需要在客户端中决定实例化哪一个工厂,就是将简单工厂的内部判断移到了客户端,如果想添加功能,简单工厂需要修改工厂类,工厂方法只需添加类。
抽象工厂

定义:提供一个创建一个很系列相关胡相互依赖的对象接口,无需指定它们具体的类。就是为创建不同的产品对象,客户端使用不同的具体工厂。
优点:便于交换产品的系列,它让具体创建实例的过程与客户端分离。但一个很大的劣势就是,当需要增加一个产品要更改一系列的具体工厂,而且,这样的类会非常的多,这是非常糟糕的,所以我们可以使用简单工厂区改进它。
用简单工厂升级抽象工厂

这里使用简单工厂替换了一系列的工厂,使用字符串区进行判断生成哪一系列的产品,简化了逻辑,但需要客户端做额外的工作了,且添加新系列的产品需要修改工厂类,添加switch判断,算是有利也有弊了,这里利用.NET的反射手段可以更加漂亮。
用反射升级抽象工厂
反射就是根据程序集加载特定命名空间下的类,它的格式为:Assembly.Load(“程序集名称”).CreateInstance(“命名空间:类名称”),现在看看他们的区别:
1 | //之前的写法 |
这样我们只需要更改字符串变量就可以灵活的生产不同的类,从而去掉工厂里面的switch判断,代码结构仍然保持不变。
策略模式

定义:它定义了算法家族,分别封装,让它们之间可以互相替换,让它们可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
解释:上下文中保存了一个策略类,使用具体的策略将它初始化,之后利用多态调用不同的策略。
优点:通常用来定义一系列的算法,所有算法完成相同的工作,只是实现不同,可以以相同的方式调用所有算法,减少各种算法之间的耦合。且优化了单元检测,每个算法有自己的类,可以用自己的接口单独检测
装饰模式

定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
解释:总的来说就是像包装,一层包一层,调用时一次拆开,调用每层的方法。
优点:它是为已有的功能能够动态的添加更多功能的一种方式。它即不会增加主类的复杂度、也让每种装饰(功能)之间分离开来,有效的把类的核心职责和装饰功能区分,客户可以按顺序包装实现特殊功能。
代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问
解释:通过在代理中组合真正实例的方式,为客户间接的调用功能。
应用:
- 远程代理:为一个对象在不同地址空间提供局部代表,可以隐藏一个对象在不同的地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象,通过它存放真实对象。
- 安全代理:用来控制真实对象访问的权限。
- 智能指引:调用真实的对象时,代理处理另外的事。
模板方法模式

定义:定义了一个算法骨架,讲其中的一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
解释:它把重复的不变的行为搬到基类,去除子类中的重复代码体现优势,它提供了一个很好的代码复用平台。
观察者模式

定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,这个主题状态变化会通知所有观察者,更新自己。
动机:一个系统分成一系列相互协同的类时需要不断维护对象之间的一致性,比如一个状态发生改变,需要调整相关对象进行改变,所以当一个对象改变引起不知道具体有多少其他对象有待改变时,就可以用到观察者模式。
实质:其实就是在接触耦合,并让耦合双方依赖于抽象,而不是依赖于具体,从而实现各自不同的变化。
不足:如果要通知的对象动作各不相同(方法名不相同)目前这个方式就无法实现了,这时可以利用委托来实现。在ConcreteSub中定义一个委托,把通知逻辑转移到客户端,客户端将不同的函数赋值给这个委托。之后在update函数中调用这个委托,就可以实现,但委托搭载的方法必须有相同的原型和形式(参数列表和返回值)。