zoukankan      html  css  js  c++  java
  • 【设计模式】概述

    在老项目重构时,总觉得设计时缺些东西,设计出来后扩展又不好
    有时候为了解决某些问题,想了一个颇复杂的方案,后来发现竟然误打误撞的用了一些设计模式
    这里对设计模式进行系统的学习和总结,以便更好的在后续的工作中进行使用

    总体来说设计模式分为三大类:

    创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
    其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:

    创建型模式:

    0、简单工厂模式——不属于23种设计模式,不符合开闭原则
    ● 普通简单工厂:多种产品实现同一个接口,创建多产品时可使用工厂类,通过不同传参,返回不同产品实例
    ● 多方法简单工厂:在普通简单工厂的基础上,在工厂类中使用不同的方法而非通过传参,返回不同产品实例
    ● 多静态方法简单工厂:在多方法简单工厂的基础上,将非静态方法变为静态方法,无需创建工厂实例,直接调用方法,返回不同的产品实例

    1、工厂方法模式
    ● 在多方法简单工厂基础上,将工厂类拆为多个,返回不同产品实例
    ● 在增加产品时,只需要新增实现产品和对应的工厂即可

    2、抽象工厂模式
    ● 一个抽象工厂,派生一个具体工厂;多个抽象产品,派生多个具体产品;一个具体工厂可产生多个具体产品
    ● 在工厂方法的基础上,有多个抽象产品,每个工厂实例可创建多个产品实例

    区别:
    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
    工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
    抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

    3、单例模式
    ● 判空构造
    ● 加锁
    ● 双重判断加锁(常用)
    ● 静态构造
    ● 内部类静态构造

    4、建造者模式
    ● 拥有一个指导者(类似于工厂中的Factory,但不是抽象的,只有一个),拥有一个抽象建造者(类似工厂的抽象产品),多个具体建造者(类似工厂的具体产品)
    ● 使用过程:用户通过告诉指导者需要什么样的建造者参数,来获取不同的建造者;不同建造者内部具体实现不同,最终获取到不同的结果
    区别:
    与工厂模式的区别是:工厂更注重创建一个实例,区别在于实例本身是不同的;而建造者模式重点在于生成实例本身的内部逻辑不同
    “抽象工厂模式(Abtract Factory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化”
    “工厂模式关心整体,建造者模式关心细节”

    5、原型模式
    ● 使用复制(浅复制或深复制),创造一系列对象,原型类需要实现Cloneable接口
    ● 符合依赖导致原则

    结构型模式:

    6、适配器模式
    ● 类的适配器模式:当期望一个类转化为满足一个新接口的类时,可创建一个新类,继承原类,实现新接口
    ● 对象的适配器模式:当期望一个对象转化为满足一个新接口的对象时,可创建一个Wrapper类,持有原类,实现新接口
    ● 接口的适配器模式:当原接口有过多方法不需要全部使用时,可创建一个Wrapper抽象类实现所有方法,再继承抽象类

    7、装饰模式
    ● 装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,在被装饰对象的方法上下进行额外操作

  • 相关阅读:
    (译).NET4.X并行任务Task需要释放吗?
    微软面向高并发应用而推出的新程序库——TPL Dataflow
    C# 5.0 Async函数的提示和技巧
    内存泄露——文章
    AJAX POST请求中参数以form data和request payload形式在php中的获取方式
    NodeJS中间层搭建
    HTML5上传预览
    laravel 图片上传 ajax 方式
    抽奖程序
    IText 生成页脚页码
  • 原文地址:https://www.cnblogs.com/shanelau/p/6439544.html
Copyright © 2011-2022 走看看