zoukankan      html  css  js  c++  java
  • 设计模式笔记

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

    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. 单例模式
      只创建一个实例,防止创建过多实例浪费内存
     
  • 相关阅读:
    分分钟提升命令行模式下密码输入逼格
    MySQL server has gone away 的两个最常见的可能性
    第一次遇到刷新缓冲区延时
    Mac上安装mysqlclient的报错
    python3 --- locale命名空间让程序更加安全了
    doctest --- 一个改善python代码质量的工具
    MySQL优化器 --- index_merge
    机智的MySQL优化器 --- is null
    Centos-7.x 下子网掩码的配置
    JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
  • 原文地址:https://www.cnblogs.com/luoyinjie/p/9400469.html
Copyright © 2011-2022 走看看