# design-patterns-demo **Repository Path**: ZhiQiangCode/design-patterns-demo ## Basic Information - **Project Name**: design-patterns-demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-12 - **Last Updated**: 2022-06-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式 ## 设计模式分类 ### 创建型模式(5种) - 1.工厂模式(Factory Pattern):在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 - 2.抽象工厂模式(Abstract Factory Pattern):在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂 都能按照工厂模式提供对象。 - 3.单例模式(Singleton Pattern):这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯 一的对象的方式,可以直接访问,不需要实例化该类的对象。 - 懒汉式,线程不安全: - 懒汉式,线程不安全: - 饿汉式: - 双重锁: - 登记式/静态内部类: - 枚举: - 4.建造者模式(Builder Pattern):这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。 该 Builder 类是独立于其他对象的。 - 5.原型模式(Prototype Pattern):这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 ### 结构型模式(8种) - 1.适配器模式(Adapter Pattern):这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔 记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 - 2.桥接模式(Bridge):这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 - 3.过滤器模式(Filter Pattern)或标准模式(Criteria Pattern):这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式 把它们连接起来 - 4.组合模式(Composite Pattern):又叫部分整体模式,组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型 模式,它创建了对象组的树形结构。 - 5.装饰器模式(Decorator Pattern):这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 - 6.外观模式(Facade Pattern):种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。 - 7.享元模式(Flyweight Pattern):主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式尝试重用现有的同类对象,如果未找到匹配的对象, 则创建新对象。 - 8.代理模式(Proxy Pattern):在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 ### 行为型模式(12种) - 1.责任链模式(Chain of Responsibility Pattern):在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求, 那么它会把相同的请求传给下一个接收者,依此类推。 - 2.命令模式(Command Pattern):是一种数据驱动的设计模式,请求一命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的合适对象, 并把该命令给相应的对象,该对象执行命令。 - 3.解释器模式(Interpreter Pattern):这种模式实现了一个表达式接口,该接口解释一个特定的上下文,这种模式被用在SQL解析、符号处理引擎等。 - 4.迭代器模式(Iterator Pattern):这种模式用于顺序访问集合对象的元素,不需要知道对象的底层表示。 - 5.中介模式(Mediator Pattern):降低多个对象和类之间通信的复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合, 使代码易于维护。 - 6.备忘录模式(Memento Pattern):保存一个对象的某个状态,以便在适当的时候恢复对象。 - 7.观察者模式(Observer Pattern):当对象间存在一对多关系时,使用观察者模式;当一个对象被修改时,则会自动通知依赖它的对象。 - 8.状态模式(State Pattern):类的行为是基于它的状态改变的。在状态模式中,我们创建表示各种状态的对象和一个另外随着状态对象改变而改变的 context对象。 - 9.空对象模式(Null Object Pattern):在该模式中,一个空对象取代NULL对象实施的检查。Null对象不是检查空值,而是反应一个不做任何动作的关系。 这样的Null对象也可以在数据不可用的时候提供默认的行为。 - 10.策略模式(Strategy Pattern):在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变 context对象的执行算法。 - 11.模板模式(Template Pattern):一个抽象公开定义了执行它的方法的方式或模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 - 12.访问者模式(Visitor Pattern):我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。 根据模式,元素对象已接收访问者对象,这样访问者对象就可以处理元素对象上的操作; ### 其他模式(8种) - MVC模式(Model-View-Controller) - Model(模型):模型代表一个存取数据的对象或JavaPOJO,它也可以带有逻辑,在数据变化时更新视图。它使视图域模型分离开; - View(视图):视图代表模型包含的数据可视化; - Controller(控制器):控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图,它视图和模型分离开; - 业务代表模式(Business Delegate Pattern):用于对表示层和业务层解耦,它基本上是用来减少通信或对表示层代码中的业务代码的远程查询,在业务层 中有以下实体: - 客户端(Client):表示层可以是JSP、Servlet、UI Java代码 - 业务代表(Business Delegate):一个为客户端实体提供的入口类,它提供了对业务方法的访问; - 查询服务(LookUp Service):查询服务对象负责获取相关的业务实现,并提供业务对象对业务代表对象的访问; - 业务服务(Business Service):业务服务接口,实现该业务服务的实体类,提供了实际的业务实现逻辑; - 组合模式(Composite Entity Pattern):用在EJB持久化机制中,一个组合实体是一个EJB实体bean,代表了对象的图解,当更新一个组合实体时,内部依 赖beans会自动更新,因为它是由EJB实体bean管理的,以下是组合实体bean的参考者: - 组合实体(Composite Entity):它是主要的实体Bean,它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。 - 粗粒度对象(Coarse-Grained Object):该对象包含依赖对象,它有自己的生命周期,也能管理依赖对象的生命周期; - 依赖对象(Dependent Object):依赖对象是一个持续生命周期依赖于粗粒度对象的对象; - 策略(Strategies):策略表示如何实现组合实体; - 数据访问对象模式(Data Access Object Interface):也叫DAO模式,用于把低级的数据访问API或操作从高级的企业服务中心分离出来,以下是数据访 问对象模式的参与者 - 数据访问对象接口(Data Access Object Interface):该接口定义了在一个模型对象上要执行的标准操作; - 数据访问对象实体类(Data Access Object concrete class):该类实现了上述的接口,该类负责从数据源获取数据,数据源可以是数据库,也可以 是xml,或者其他的存储机制; - 模型对象/数值对象(Model Object/Value Object):该对象是简单的POJO,包含了get/set方法来存储通过使用DAO类检索到的数据 - 前端控制器模式(Front Controller Pattern):用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理,该处理程序可以做认证/ 授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体: - 前端控制器(Front Controller):处理应用程序所有类型请求的单个处理程序,应用程序可以是基于web的应用程序,也可以是基于桌面的应用程序; - 调度器(Dispatcher):前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序; - 视图(View):视图是为了请求而创建的对象; - 拦截过滤器模式(Intercepting Filter Pattern):用于对应用程序的请求或响应做一些预处理后的处理,定义过滤器,并在把请求传给实际目标应用程序 之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序,以下是这种设计模式的实体: - 过滤器(Filter):过滤器在请求处理程序执行请求之前或者之后,执行某些程序; - 过滤器链(Filter Chain):过滤器链带有多个过滤器,并在Target上按照定义的顺序执行这些过滤器; - Target:Target对象是请求处理程序; - 过滤管理器(Filter Manager):过滤管理器管理过滤器和过滤器链 - 客户端(Client):Client是向Target对象发送请求的对象 - 服务定位器模式(Service Locator Pattern):用在我们想使用JNDI查询定位各种服务的时候。考虑到位某个服务查找JNDI的代价很高,服务定位器模式会 充分利用了缓存技术,在首次请求某个服务时,服务定位器在JNDI中查找服务,并缓存该服务对象,当再次请求相同的服务时,服务定位器会在它的缓存中查找, 这样可以在很大程度上提高应用程序的性能,这种设计的实体: - 服务(Service):实际处理请求的服务,对这种服务的引用可以在JNDI服务器中查找到; - Context/初始的Context:JNDI Context 带有对要查找的服务的引用; - 服务定位器(Service Locator):服务定位器是通过JNDI查找和缓存服务来获取服务的单点接触; - 缓存(Cache):缓存存储服务的引用,以便复用他们; - 客户端(Client):Client是通过ServiceLocator调用服务对象; - 传输对象模式(Transfer Object Pattern):用于从客户端向服务端一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter方法的简单的POJO类,它是可序列号的,所以它可以通过网络传输,他没有任何的行动,服务器端的业务类通常从数据库读取数据,然后填充POJO, 并把他发送到客户端或按值传递,对于客户端,传输对象是只读的,客户端可以创建自己的传输对象,并把它传输给服务器,一遍一次性更新数据库中的数值, 以下是这种设计模式的实体: - 业务对象(Business Object):为传输对象填充数据的业务服务 - 传输对象(Transfer Object):简单的POJO,只是设置/获取属性的方法; - 客户端(Client) :客户端可以发送请求或者发送传输对象到业务对象;