设计模式一套被反复使用,多数人知晓的代码设计经验的总结,实现可重用代码,使代码更容易被理解,保证代码可靠性。

总体来说,设计模式分为三大类:

创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

行为型模式(十一种):策策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

常见的设计模式介绍:

1、单例模式

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

应用实例: 1、一个党只能有一个书记。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

2、工厂模式

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

3、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

4、观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。


感谢大家看到最后,我是不务正业的程序汪,文章每天持续更新!欢迎大家指出我的文章的不足之处,也欢迎大家关注、点赞+转发。

接口也可以创建对象吗_面试时,一个小小的设计模式可以把你虐成渣相关推荐

  1. 【转】面试:一个单例模式,足以把你秒成渣

    去面试(对,又去面试) 问:单例模式了解吧,来,拿纸和笔写一下单例模式. 我心想,这TM不是瞧不起人吗?我编程十年,能不知道单例模式. 答:(.net 平台下)单例模式有两种写法: 第一种:饥饿模式, ...

  2. python面试题_面试时全对这25道python面试题,成就了我月薪25K!附教程分享)

    之前面试的时候,面试官拿出一些python面试题对我说,只要全部正确直接给我20K,我一看题目笑了,居然全部都会,今天拿出来给大家分享一下~ 面试时全对这25道python面试题,成就了我月薪20K! ...

  3. php算法求出一个数可以被分解成多少个_面试时写不出排序算法?看这篇就够了(下)...

    昨天给大家介绍了面试时到底应该如何写出排序算法,也简单的介绍了一些方法 今天我们继续为大家介绍 前言 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.通常涉及函数调用自身. 能 ...

  4. 大数据面试3分钟自我介绍_面试时三分钟自我介绍,需要注意哪些问题?

    "面试20分钟,开头占大头."一个好的自我介绍真真真真的太太太重要了! 作为一个从业近10年的hr,在面试当中,如果应聘者给我们的第一印象很好,大方得体,他入选的概率就要大很多. ...

  5. 用php写一个可以抽取随机数的工具一次只抽四个怎么实现?_面试了一个32岁的程序员,场面一度很尴尬。...

    招人背景 首先说一下朋友的公司招人背景,公司招聘PHP高级岗位,负责公司的B2B项目研发.并发问题的处理和解决.领导给了他两个要求:(接下来的讲述我会以朋友的第一人称来进行) (1)技术比较好 (2) ...

  6. c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了

    小Hub领读: 本文主要详细讲述常见的八种排序算法的思想.实现以及复杂度.包括冒泡排序.快速排序.插入排序.希尔排序等等,文章讲解非常详细! 作者:静默虚空 https://juejin.im/pos ...

  7. system流怎么判断为空_面试时被问到单例模式,怎么回答才能让面试官眼前一亮?...

    考虑到马上到来的金九银十的面试季,我给大家介绍一下面试官的必问题,先从单例模式开始,这个设计模式看似简单,想回答得让面试官眼前一亮,还不是那么容易的. 一.什么是单例模式 单例模式是一种常用的软件设计 ...

  8. redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?

    什么是内存淘汰 内存淘汰,和平时我们设置redis key的过期时间,不是一回事:内存淘汰是说,假设我们限定redis只能使用8g内存,现在已经使用了这么多了(包括设置了过期时间的key和没设过期时间 ...

  9. python面试自我介绍怎么介绍比较好_面试时三分钟自我介绍,需要注意哪些问题?...

    万事开头难,许多面试的开场问题就是"能否请你做一下自我介绍".在一场为时十几分钟乃至几十分钟的面试里,留给应聘者做自我介绍的时间一般也只有3分钟左右.在如此短的时间内,要如何&qu ...

最新文章

  1. 【转】Mac 程序员的十种武器
  2. K近邻(KNN)算法是基于实例的算法,如果训练样本数量庞大,预测的时候挨个计算距离效率会很低下,如何破解?
  3. .net项目的二次开发解决方案
  4. linux——shell 中的运算
  5. Android添加Header请求参数实例,java响应header请求实现demo
  6. Java基础——Java反射机制及IoC原理
  7. 《阿里云互联网多媒体存储解决方案蓝皮书》震撼上线!
  8. 不是纯技术的管理技术
  9. ICP算法与Kdtree
  10. iOS——使用StroryBoard页面跳转及传值
  11. R-CNN、Fast R-CNN、Faster R-CNN算法对比
  12. 西威变频器调试软件GF-EXprss
  13. sql server 函数根据分隔符号拆分字符
  14. InsecureProgramming-master——abo1
  15. 利用最小二乘法进行参数估计
  16. Excel中 匹配尾部字符并替换
  17. ceph-kvstore-tool
  18. IDEA在同一工作空间,显示多个项目
  19. 在c语言程序中使用数据库,数据库与C语言程序设计两者之间有什么联系?
  20. 狂赚 1200 亿,差点收购苹果,影响千万程序员,那个叫做太阳的公司却陨落了!...

热门文章

  1. latex 引用_VS Code + LaTex + Zotero 写作毕业论文
  2. 汽车维修保养记录php源码,汽车维修保养记录
  3. antd table设置表格一个单元格的字体颜色_微软Office三件套,各有一个效率神器,全都知道的人不超过1%...
  4. 神秘大三角(判断点与三角形的关系)
  5. 怎么用esc服务器做网站,云服务器esc能做网站
  6. zabbix监控mysql的哪些参数_Centos6.3下zabbix监控mysql数据库参数
  7. php 调用变量方法名,php中引用(变量和函数名前加符号)用法
  8. oracle数据库切换教程,oracle 11gR2 物理备用数据库搭建及切换
  9. python温度转换程序_用Python程序温度转换实例
  10. 用C#操作word替换字符,用spire