设计模式笔记

设计模式的一个重要原则就是:别改代码,只需要添代码,以前所有的老代码,都是有价值的,需要尽力保留

1. 策略模式的使用情景:

  策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。

  比如实现人脸检测可以用几种不同的方法,那么就可以写成策略模式

  FaceDetecter<PCN> detecter;

  FaceDetecter<MTCNN> detecter;

  FaceDetecter<RCNN> detecter;

2. 工厂模式

  就是初始化放在Factory类里面完成, 初始化和使用分开

new一个对象时,new的过程是宝贵的如何创建老对象的知识点(有的new很复杂,包括了很多参数),如果这个代码被修改了,那么保留的老对象也不知道怎么使用了,整个体系残缺了
所以要想办法保留老对象的new过程,把这个new过程保存分布到一系列工厂类里,就是所谓的工厂模式,一般有三种方式来封装

  简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。这个缺点是每添一个对象,就需要对简单工厂进行修改(尽管不是删代码,仅仅是添一个switch case,但仍然违背了“不改代码”的原则)

工厂方法:每种产品由一种工厂来创建,一个工厂保存一个new基本完美,完全遵循 “不改代码”的原则

抽象工厂:仅仅是工厂方法的复杂化,保存了多个new    大工程才用的上

 

工厂模式并不仅仅是用来new出一个类的对象的。
简单工厂确实如题主的描述所说,是一个工厂对应一个类的关系。

在这里,可以举出一些复杂的例子,与题主的描述不同。
假设有代码包A和代码包B,
代码包B是代码包A的调用者,A向B暴露接口InterfaceA。
在A的内部结构中,实现了InterfaceA的有ClassA1,ClassA2,ClassA3,……ClassA100。

但是B并不关心这些,因为对于B来说,A的功能只有一个,就是InterfaceA。
这个时候,B想要使用一个InterfaceA的实现,想要new一个出来,但又不想与代码包A中的复杂的构造逻辑耦合,怎么办?

只能向代码包A中传递参数,交给代码包A自己选择到底是那个ClassA1还是A100被new出来。
而这个对构造过程进行选择的逻辑,就是工厂

当然了,我这里举的例子是InterfaceA,你也可以用AbstractClassA之类的。

工厂在这里面起的作用,就是隐藏了创建过程的复杂度,以配合InterfaceA对那一百个子类的复杂度进行隐藏,这样B只要知道上转型之后的InterfaceA即可,简单清晰。

3. 单例模式
  只创建一个实例,防止创建过多实例浪费内存
 
原文地址:https://www.cnblogs.com/luoyinjie/p/9400469.html