设计模式
questions?
Hold on
展开
-
设计模式之单例模式(面试高频)(创建型)
文章目录单例模式概念及应用场景饿汉式单例饿汉式写法一饿汉式写法二懒汉式单例简单懒汉式双重检查法反射破坏静态内部类写法多线程debug方法注册式单例枚举式单例写法容器式单例(Spring改良的)序列化破坏单例ThreadLocal单例(不常用)单例模式在源码中的应用单例模式概念及应用场景概念:顾名思义单例模式即一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。应用场景J2EE中的ServletContext,ServletContextConfig等Spring框架中的Applicat原创 2021-03-01 17:16:43 · 379 阅读 · 2 评论 -
设计模式之工厂模式(创建型)
文章目录为什么要学习设计模式什么是解耦一个小案例说明设计模式的好处简单工厂模式(过渡看的小demo)工厂方法模式抽象工厂模式(慎用)两个问题为什么要学习设计模式官方定义:设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为原创 2021-03-01 11:46:58 · 219 阅读 · 0 评论 -
设计模式的七大设计原则
前言:七大设计原则的目的都是为了设计出稳定的代码结构,以后如果要新增业务时,让我们可以不去改动之前稳定的代码,简单的新增代码就可以了,修改底层代码那可能会带来意想不到的风险(频繁的毫无章法的修改代码很容易导致之前的代码也不能用或者执行结果改变),但是我们也不是说任何时候都要去追求符合七大设计原则,(我们得考虑人力,时间,成本,质量等等因素)而是在适当的场景遵循设计原则。跟数据结构的时空思想类似,是一种平衡取舍的思想。文章目录1.开闭原则2.依赖倒置原则3.单一职责原则4.接口隔离原则5.迪米特原则6.里原创 2020-08-01 18:27:13 · 885 阅读 · 0 评论 -
设计模式总结和对比
文章目录七大设计原则创建型设计模式结构型设计模式行为型设计模式使用频率比较创建型设计模式结构型模式行为型模式直达设计模式文章专栏七大设计原则创建型设计模式结构型设计模式行为型设计模式使用频率比较创建型设计模式高频工厂方法模式抽象工厂模式单例模式建造者模式低频原型模式结构型模式高频代理模式门面模式装饰器模式享元模式适配器模式组合模式低频桥接模式行为型模式高频模板方法模式策略模式责任链模式状态模式原创 2021-03-13 14:53:33 · 90 阅读 · 0 评论 -
设计模式之访问者模式(行为型)
定义概念它是一种将数据结构与数据操作分离的设计模式,指封装一些作用于某种数据结构中的各元素的操作应用场景数据结构稳定,作用于于数据结构的操作经常变化的场景需要数据结构与数据操作分离的场景需要对不同数据类型(元素)进行操作,而不使用分支判断具体类型的场景写法CTO和CEO去访问员工的业绩,但两者关注的点不一样,CTO关注代码数量和产品数量,CEO关注KPIpublic interface IVisitor { void visit(Engineer engineer);原创 2021-03-13 14:11:13 · 81 阅读 · 0 评论 -
设计模式之观察者模式(行为型)
定义概念也称发布——订阅模式模型——视图模式源——监听器模式从属者模式定义一种一对多的依赖关系,一个主题对象可被多个观察者对象同时监听,每当主题对象状态变化时,所有依赖于它的对象都会得到通知并自动更新。核心将观察者与被观察者解耦,类似于消息/广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应写法阿里巴巴旗下的蚂蚁金服发出招聘请求,自动推送给人们public class Alibaba extends Observable { priv原创 2021-03-13 10:55:40 · 99 阅读 · 0 评论 -
设计模式之中介者模式(行为型)
定义概念又称调解者模式或调停者模式,用一个中介对象封装一系列的对象交互,使各对象不需要显示地交互,从而达到解耦合的作用。写法public class User { private String name; private ChatRoom chatRoom; public User(String name, ChatRoom chatRoom) { this.name = name; this.chatRoom = chatRoom;原创 2021-03-13 09:02:31 · 77 阅读 · 0 评论 -
设计模式之备忘录模式(行为型)
概念和应用场景概念又称快照模式,指不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态应用场景需要后悔药的功能的时候,比如每天使用的Git,SVN等代码版本撤回的功能写法备忘录管理员public class Caretaker { // 备忘录对象 private Memento memento; public Memento getMemento() { return this.me原创 2021-03-07 20:31:21 · 85 阅读 · 0 评论 -
设计模式之状态模式(行为型)
不是策略模式,策略是自己选择,而状态是系统自动帮我们调整状态写法public abstract class UserState { protected AppContext context; public void setContext(AppContext context) { this.context = context; } public abstract void favorite(); public abstract void co原创 2021-03-07 16:37:38 · 89 阅读 · 1 评论 -
设计模式之命令模式(行为型)
写法用户不直接使用播放器,而是通过控制器使用命令,进行了解耦public interface IAction { void execute();}public class GPlayer { public void play(){ System.out.println("正常播放"); } public void speed(){ System.out.println("拖动进度条"); } public void原创 2021-03-07 15:38:06 · 108 阅读 · 0 评论 -
设计模式之迭代器模式(行为型)
概念概念也称游标模式,它提供了一种顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,不用关心容器内部元素组成结构写法public class Course { private String name; public Course(String name) { this.name = name; } public String getName() { return name;原创 2021-03-07 15:19:22 · 92 阅读 · 1 评论 -
设计模式之责任链模式(行为型)
概念概念将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。写法(还用到了建造者模式)public abstract class Handler<T> { protected Handler next; public void next(Handler next){ this.next = next;} public ab原创 2021-03-07 14:48:16 · 90 阅读 · 0 评论 -
设计模式之策略模式(行为型)
概念和应用场景概念又称政策模式,它是将定义的算法家族,分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。实现了统一行为在不同场景下不同的实现(通过继承和多态机制)应用场景针对同一类型问题,有多种处理方式,每一种都能独立解决问题算法需要自由切换的场景需要屏蔽算法规则的场景写法public interface IPromotionStrategy { void doPromotion();}public class CashbackStrat原创 2021-03-07 14:14:14 · 84 阅读 · 1 评论 -
设计模式之模板方法模式(行为型)
概念和应用场景概念指定义一个操作中的算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤(通过重写父类的方法)应用场景一个操作有固定的的流程时,抽象固定流程步骤,具体步骤交给子类进行具体实现写法public abstract class AbastractCourse { public final void createCourse(){ //1、发布预习资料 postPreResoucse();原创 2021-03-07 11:01:10 · 91 阅读 · 1 评论 -
设计模式之委派模式(行为型)
概念和应用场景概念作用是负责任务的调用和分配任务,是一种特殊的静态代理,区别是代理模式注重过程,委派模式注重结果写法public class Boss { public void command(String task,Leader leader){ leader.doing(task); }}public interface IEmployee { void doing(String task);}public class EmployeeA原创 2021-03-07 10:26:50 · 122 阅读 · 1 评论 -
设计模式之适配器模式(结构型)
概念和应用场景概念又称变压器模式,功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作应用场景它不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而借口不相同情况下的解决方案,亡羊补牢写法public class AC220 { public int outputAC220V(){ int output = 220; System.out.println(原创 2021-03-07 09:26:24 · 83 阅读 · 1 评论 -
设计模式之组合模式
概念和应用场景概念也称整体——部分模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示组合和聚合的区别组合具有相同的生命周期(一个皇帝有很多妃子,但是每个妃子只属于皇帝,皇帝去世了,妃子也得跟着去世)聚合具有不同的生命周期(一个老师有很多学生,一个学生又属于多个老师,一个老师走了,学生仍然可以不走)写法模仿操作系统的文件目录及文件public abstract class Directory { protected String na原创 2021-03-07 08:37:58 · 96 阅读 · 2 评论 -
设计模式之享元模式(结构型)
概念和应用场景概念享元模式也称轻量级模式,是对象池的一种实现。类似于线程池,线程池可以避免不停地创建和销毁多个对象,提高性能。宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,降低内存的消耗。应用场景当系统中对象数量太多带来性能下降等问题时,就需要享元模式系统底层开发,解决性能问题系统有大量相似对象,需要缓冲池的场景写法public interface ITicket { void showInfo(String bunk);}原创 2021-03-05 20:28:53 · 70 阅读 · 0 评论 -
设计模式之装饰器模式(结构型)
定义和应用场景定义也称包装模式,它是指在不改变原有对象的基础之上,将功能附加到对象上(功能扩展),提供了比继承更有弹性的替代方案(扩展原有对象的功能)应用场景用于扩展一个类的功能或给一个类添加附加职责动态的给一个对象添加功能,这些功能可以再动态的撤销写法public abstract class Battercake { protected abstract String getMsg(); protected abstract int getPrice();}原创 2021-03-04 20:09:42 · 165 阅读 · 1 评论 -
设计模式之门面模式(结构型)
定义和应用场景定义也称外观模式,提供了一个统一的接口,用来访问子系统的一群接口应用场景子系统复杂,用门面模式能够简化调用写法// 子系统public class SubSystemA { public void doA() { System.out.println("doing A stuff"); }}// 子系统public class SubSystemB { public void doB() { System.out原创 2021-03-04 16:42:09 · 172 阅读 · 1 评论 -
设计模式之建造者模式(创建型)
建造者模式的概念及应用场景概念建造者模式是将一个复杂对象的构建过程与它的表示分离。应用场景如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离,还适用于以下几个方面相同的方法,不同的执行顺序,产生不同的结果时多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时基本写法public class CourseBuilder {原创 2021-03-03 18:08:08 · 161 阅读 · 1 评论 -
设计模式之原型模式(创建型)
文章目录原型模式的应用场景一个恶心的小案例感受一下什么时候需要用到原型模式原型模式常用的写法浅克隆深克隆Spring中的Scope="prototype"原型模式的应用场景概念原型模式指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。核心它是直接基于内存二进制流进行拷贝,无需再经历耗时的对象初始化过程(不调用构造函数),性能提升许多。应用场景当对象的构建过程比较耗时时,可以利用当前系统中已存在的对象作为原型,对其进行拷贝,躲避初始化过程,使得新对象的创建时间大大减少一个恶心原创 2021-03-03 16:28:05 · 287 阅读 · 1 评论