美文网首页
设计模式概要

设计模式概要

作者: 你的操作666 | 来源:发表于2017-06-14 16:50 被阅读24次

    创建型模式:工厂模型,抽象工厂模型,建造模型,原型模型,单例模型,
    结构型模式:适配器,桥,组合模型,
    行为型设计模式:命令模型,迭代模型,观察者模型。
    名词解释
    设计模式
    是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、 让代码更容易被他人理解、保证代码可靠性。

    image.png
    抽象工厂 image.png
    1、工厂方法模式完全符合“开闭原则”。
    2、工厂方法模式使用继承,将对象的创建委托给子类,通过子类实现工厂方法来创建对象。
    3、工厂方法允许类将实例化延伸到子类进行。
    4、工厂方法让子类决定要实例化的类时哪一个。在这里我们要明白这并不是工厂来决定生成哪种产品,而是在编写创建者类时,不需要知道实际创建的产品是哪个,选择了使用哪个子类,就已经决定了实际创建的产品时哪个了。
    5、在工厂方法模式中,创建者通常会包含依赖于抽象产品的代码,而这些抽象产品是、由子类创建的,创建者不需要真的知道在制作哪种具体产品。
    2ZOA~U}S}~[]XPJ7$F1MTUU.png

    工厂方法模式
    一个抽象产品类,可以派生出多个具体产品类。
    一个抽象工厂类,可以派生出多个具体工厂类。
    每个具体工厂类只能创建一个具体产品类的实例。
    抽象工厂模式
    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
    一个抽象工厂类,可以派生出多个具体工厂类。
    每个具体工厂类可以创建多个具体产品类的实例。
    区别
    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

    原型模式

    image.png AYHB[M{I~J7WN86VP8L]Q}N.png

    (1)Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。
    (2)ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
    (3)Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。

    原型模式的优缺点:

    优点:(1):当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。

    (2):扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,而将具体原型类写到配置文件中,增减或减少产品对原有系统都没有影响。

    (3):原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,圆形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。

    (4):可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。

    缺点:(1):需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则

    (2):在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。

    原型模式的适用环境:

    1:创建新对象成本较大(例如初始化时间长,占用CPU多或占太多网络资源),新对象可以通过复制已有对象来获得,如果相似对象,则可以对其成员变量稍作修改。

    2:系统要保存对象的状态,而对象的状态很小。

    3:需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的组合状态,通过复制原型对象得到新实例可以比使用构造函数创建一个新实例更加方便。

    单例模式

    image.png

    ![E~Q(VQ@QP19)5C9{(LNY]BV.png](https://img.haomeiwen.com/i6358919/293f4f1943b3a923.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    一般包含三个要素:

    1.私有的静态的实例对象 private static instance

    2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) private Singleton(){}

    3.公有的、静态的、访问该实例对象的方法 public static Singleton getInstance(){}

    适配器模式

    image.png $D7I)LNL(186{QG@3TII0)U.png OQ2DD4O%56ZRGX6$Q`2OS3L.png
    Target目标角色

    该角色定义把其他类转换为何种接口,也就是我们期望的接口。

    ● Adaptee源角色

    源角色是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新亮丽的角色。

    ● Adapter适配器角色

    适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:通过继承或是类关联的方式,把源角色转换为目标角色。

    适配器模式的优点:
    ● 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成
    ● 增加了类的透明性
    高层模块访问的是Target目标角色,具体的业务实现的是Adaptee源角色。
    ● 提高了类的复用度
    Adaptee源角色在原有系统中还可以正常使用,而在目标角色中也可以充当新的角色。
    ● 灵活性非常好
    如果不需要适配器了,删除适配器就可以了,其他的代码都不用修改。基本上就类似一个灵活的构件,想用就用,不想就卸载。
    适配器模式的使用场景:
    要修改一个己经投产中的接口时,适配器模式可能是最适合的模式了。
    适配器模式的注意事项:
    适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中。

    组合模式

    image.png 0%}[O6WY8HEGBW]_E`6O1U1.png

    ![A[)(NI8ZE6P36M4AP(@$X0.png

    组合模式的透明性与安全性

    image.png

    在类层次结构的根部定义子节点管理接口的方法具有良好的透明性,因为你可以一致地使用所有的组件,但是这一方法是以安全性为代价的,因为客户有可能会做一些无意义的事情。
    命令模式

    image.png Z4$Y03KUDZ5A@JKHU37M1UU.png

    迭代模式

    image.png

    ![L{[GGH@U0%R4KPVJ(`[$$T.png

    观察者模式

    image.png

    ![`%31F4L)1YAZCDJC4E]2Q8P.png](https://img.haomeiwen.com/i6358919/09205c07c8dad861.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    相关文章

      网友评论

          本文标题:设计模式概要

          本文链接:https://www.haomeiwen.com/subject/xifeqxtx.html