# designpattern **Repository Path**: CodersCode/designpattern ## Basic Information - **Project Name**: designpattern - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-02 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### **设计模式** ### 1.设计模式--三种工厂模式 **工厂模式** 把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了。而这种方法的缺点也很明显,违背了设计模式的开闭原则,因为如果你要增加工厂可以初始化的类的时候,你必须对工厂进行改建。 **工厂方法模式** 设计一个工厂的接口,你想要什么东西,就写个类继承于这个工厂,这样就不用修改什么,直接添加就行了。就相当于,这个工厂是用来生形状的,而要什么形状要具体分到了每个车间,如果新多了一种形状,直接新增一个形状工厂就行了。 **抽象工厂模式** 抽象工厂模式可以理解为工厂的工厂,用来创建其他工厂。当使用抽象工程模式时,我们首先使用超级工厂创建出工厂然后使用创建出的工厂去创建对象。抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。 ### 2.设计模式--单例模式 简介 创建型模式,这种模式只涉及一个单独的类,它负责创建自己的对象,该类也确保只创建单个对象。 特点 类构造器私有 持有自己类型的属性 对外提供获取实例的静态方法 常用分类有五种: > 1、懒汉式 > 懒汉式,顾名思义就是实例在用到的时候才去创建,“比较懒”,用的时候才去检查有没有实例,如果有则返回,没有则新建。有线程安全和线程不安全两种写法,区别就是synchronized关键字。 > 2、饿汉式 > 饿汉式,从名字上也很好理解,就是“比较勤”,实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间。 > 3、双检锁 > 双检锁,又叫双重校验锁,综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中,特点是在synchronized关键字内外都加了一层 > if 条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。 > 4、静态内部类 > 静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。 > 5、枚举 > 枚举的方式是比较少见的一种实现方式,但是看上面的代码实现,却更简洁清晰。并且她还自动支持序列化机制,绝对防止多次实例化。 ### 3.设计模式--建造者模式 简介 建造者模式是一种创建型设计模式,它把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。 主要四大角色: > Product:表示被构造的复杂对象,其中包含需要构建的部件属性。 > Builder:创建一个产品对象的各个部件指定抽象接口。 > ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示。 > Director:调用具体建造者角色以创建产品对象。 ### 4.设计模式--原型模式 简介 原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。 > 原理: 将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。 > 由于在软件系统中我们经常会遇到需要创建多个相同或者相似对象的情况,因此原型模式在真实开发中的使用频率还是非常高的。 > 原型模式是一种“另类”的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。 > 需要注意的是通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。 ### 5.设计模式--适配器模式 > 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。 > 该模式的主要优点如下: > 客户端通过适配器可以透明地调用目标接口。 > 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。 > 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。 > 其缺点是:对类适配器来说,更换适配器的实现过程比较复杂。 > ### 6.设计模式--装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 ### 7.设计模式--桥接模式 > 桥接模式用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。 >   抽象化 >   从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征,就是抽象化。例如苹果、香蕉、生梨、 桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象化的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。 所以抽象化的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。 >   通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。 >   实现化:抽象化给出的具体实现,就是实现化。 >   一个类的实例就是这个类的实例化,一个具体子类是它的抽象超类的实例化。 >   脱耦 >   所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。 >   所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。显然,在Java语言中,继承关系是强关联,而聚合关系是弱关联。 >   将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。 > ### 8.设计模式--外观模式(门面模式) 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。 外观模式主要包含角色: 外观类(Facade): 也叫门面角色,是外观模式的核心。为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象。 调用者(Client): 外观接口的调用者。 子系统的集合:指模块或者子系统,处理 Facade对象指派的任务,他是功能的实际提供者。 ### 9.设计模式--组合模式 组合(Composite)模式是一种对象的行为模式。 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式的本质:统一叶子对象和组合对象。 组合模式的目的:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。 > 角色及其职责: > 抽象组件(Component)角色:为组合对象和叶子对象声明公共的接口,让客户端可以通过这个接口来访问和管理整个对象树,并可以为这些定义的接口提供缺省的实现。 > 组合对象(Composite)角色:通常会存储子组件(组合对象、叶子对象),定义包含子组件的那些组件的行为,并实现在抽象组件中定义的与子组件有关的操作,例如子组件的添加(addChild)和删除(removeChild)等。 > 叶子对象(Leaf)角色:定义和实现叶子对象的行为,并且它不再包含其他的子节点对象。 > 客户端(Client)角色:通过Component接口来统一操作组合对象和叶子对象,以创建出整个对象树结构。 ### 10.设计模式--代理模式 为其它对象提供一个代理对象,并由代理对象控制这个对象的访问。 特点 1)很直接的,实现同一个接口或者继承同一个抽象类。 2)代理对象控制对被代理对象的访问。 > 代理模式中的角色: > 抽象主题角色(Subject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。 > 具体主题角色(RealSubject):也称为委托角色或者被代理角色。定义了代理对象所代表的目标对象。 > 代理主题角色(Proxy):也叫委托类、代理类。代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。 ### 11.设计模式--过滤器模式(标准模式) 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。 优点:简单,解耦,使用方便。 使用场景:需要进行筛选时。 > 角色 > 过滤器模式包含如下角色: >   (1) AbstractFilter(抽象过滤器角色):定义过滤的方法。 >   (2) ConcreteFilter(具体滤器角色):实现过滤的方法,对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。 >   (3) Subject(被过滤角色):目标角色,源数据,具体过滤器会对其进行逻辑处理。 ### 12.设计模式--责任链模式 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 ### 13.设计模式--命令模式 命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 1.数据驱动设计模式,它是行为模式之一 2.请求以命令的形式包裹在对象中,并传给调用对象。 3.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 ### 14.设计模式--迭代器模式 迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。 在迭代器模式中,提供了一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的元素,了解哪些元素已经遍历过而哪些没有。迭代器的引入,将使得对一个复杂聚合对象的操作变得简单。 在迭代器模式中应用了工厂方法模式,抽象迭代器对应于抽象产品角色,具体迭代器对应于具体产品角色,抽象聚合类对应于抽象工厂角色,具体聚合类对应于具体工厂角色。 > 角色 > 迭代器模式有如下几个角色: > Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。 > ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。 > Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。 > ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。