# DesignProject **Repository Path**: puhome/DesignProject ## Basic Information - **Project Name**: DesignProject - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 创建型模式 主要关注怎样创建对象; 主要特点是将对象的创建与使用分离; 降低系统耦合度,使用者不需要关注对象的创建细节,对象的创建由工厂完成。就像去商场买东西,不需要知道是怎么生产出来的,又专门的工厂生产。 ## 单例模式 ### 使用场景 保证一个类仅有一个实例,并提供一个访问它的全局访问点,避免重复的创建对象,节省系统资源,也就是一个系统(一个实例)的一个类只创建 一个对象,集群下同样适用,每个实例一个类都创建一个对象,节省系统资源 ### 实现方式 懒汉式(线程不安全)-不推荐:SingleLanhan1,未加锁,在多线程下 不能正常工作 懒汉式(线程安全)-不推荐:SingleLanhan2,加锁,但效率低 饿汉式-推荐:优点:没有加锁效率高, classloader 机制避免多线程同步问题;缺点:类加载时就初始化,浪费内存 双检索/双重校验-推荐:安全且在多线程情况下保持高性能 静态内部类-推荐:这种方式能达到双检锁方式一样的功效,对静态域使用延迟初始化,但实现更简单。 这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用 枚举-推荐:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。 这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制, 防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏, 在实际工作中,也很少用。 ## factory 简单工厂模式 ### 使用场景 不同条件下创建不同的实例 数据库访问:不同数据库的访问 支付方式的选择 每个实例能够抽象出共同的参数,其它不同的参数如何传 ### 优点 调用者想要创建对象,只要知道名称即可; 扩展性高,想增加一个活动玩法,只需扩展一个工厂类即可; ### 缺点 增加了系统复杂度; 增加了系统具体类的依赖; ## factoryMethod 工厂方法模式 如果类的数量比较多,且会不定期增加,则用此模式 例:支付平台包含微信支付、支付宝支付 畜牧场用于养马、养牛 ## abstractFactory 抽象工厂模式 上面畜牧场只用于养马、养牛这一类,但如果还能养其它类就用此模式 ## proto 原型模式 用一个已经创建的实例做为原型,通过复制该原型对象创建一个和原型相同或相似的新对象 # 结构型模式 ## 适配器模式 适配器实现接口里的默认方法,调用者继承适配器,避免每次实现接口,将所有方法都实现一遍 例: 适配器 ChannelInboundHandlerAdapter(适配器设计模式) ChannelInboundHandler接口继承ChannelHandler接口,如果自定义Handler直接实现ChannelInboundHandler接口 会有很多方法需要实现, 于是提供了ChannelInboundHandlerAdapter适配器做了默认实现,自定义Handler继承ChannelInboundHandlerAdapter时,只需要重写自己 关心的方法即可 根据不同对象进行适配 例:发动机又包含电能发送机、光能发动机等 ## 代理模式 通用接口 普通类实现接口 代理类实现接口,并返回普通类 用户只需调用代理类即可,无须关心具体是谁实现的,且代理类还可以添加一些增强的属性或操作 静态代理:代理类直接实现接口 动态代理:代理类通过反射实现动态代理 JDK动态代理:只能基于接口 CGLIB动态代理:没有接口也可以 对类进行动态代理 # 命令模式 ### 使用场景 点餐,选择不同的种类组合,服务员为调用者,厨师为接收者 报名成功后的流程,发短信、数据对接、特殊场景1、特殊场景2 创建一个活动时,选择1个或多个报名后需要执行的事件(发短信、数据对接等) 定义一个方法,取出执行事件,依次执行 arraylist 解决for循环问题,数据库里存储一个list直接取出来 http://c.biancheng.net/view/1338.html