目录

Java 设计模式概述

设计模式六大原则

简单工厂模式

普通简单工厂

多方法简单工厂

静态方法简单工厂


Java 设计模式概述

1、Java 23 种设计模式总体来说分为三大类:

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

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

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

2、java 23 种设计模式简介如下:

1)Singleton(单例模式):保证一个类只有一个实例,并提供一个访问它的全局访问点。

2)Abstract Factory(抽象工厂) :提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类。

3)Factory Method(工厂方法):定义一个用于创建对象的接口,让子类决实例化哪一个类,Facetory Method 使一个类的实例化延迟到了子类。

4)Builder(建造模式):将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

5)Prototype(原型模式):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

6)Iterator(迭代器模式):提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。

7)Observer(观察者模式):定义对象间一多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知自动更新。

8)Template Method(模板方法):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,Template Method 使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。

9)Command(命令模式):将一个请求封装为对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录日志,以及支持可撤销的操作。

10)State(状态模式):允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了它的类。

11)Strategy(策略模式):定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可独立于使用它们的客户。

12)China of Responsibility(职责链模式):使多个对象都有机会处理请求,从而避免请求的送发者和接收之间耦合关系。

13)Mediator(中介者模式):用一个中介对象封装一系列的对象交互。

14)Visitor(访问者模式):表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。

15)Interpreter(解释器模式):给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

16)Memento(备忘录模式):在不破坏对象的前提下, 捕获一个对象的内部状态,并在该对象之外保存这个状态。

17)Composite(组合模式):将对象组合成树形结构以表示部分与整体的关系,Composite 使得用户对单个象和组合对象的使用具有一致性。

18)Facade(外观模式):为子系统中的一组接口提供致一致的界面, facade 提供了一个高层接口,这个接口使得子系统更容易使用。

19)Proxy(代理模式):为其他对象提供一种代理以控制这个对象的访问。

20)Adapter(适配器模式):将一类的接口转换成客户希望的另外一个接口,Adapter 模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。

21)Decrator(装饰器模式):动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator 模式相比生成子类更加灵活。

22)Bridge(桥模式):将抽象部分与它的实现部分相相离,使他们可以独立的变化。

23)Flyweight(享元模式)

3、用图整体描述如下:

设计模式六大原则

总原则:开闭原则(Open Close Principle)

1)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。

2)所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等。

1、单一职责原则

1)不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

2、里氏替换原则(Liskov Substitution Principle)

1)里氏代换原则(Liskov Substitution Principle LSP) 是面向对象设计的基本原则之一。

2)里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

3)里氏代换原则是对“开-闭”原则的补充,实现“开-闭”原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

4)里氏代换原则中指出,子类对父类的方法尽量不要重写和重载,因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

3、依赖倒转原则(Dependence Inversion Principle)

1)这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

4、接口隔离原则(Interface Segregation Principle)

1)这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。

2)使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

5、迪米特法则(最少知道原则)(Demeter Principle)

1)一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public 方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

2)最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现为成员变量、方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中。

6、合成复用原则(Composite Reuse Principle)

原则是尽量首先使用合成/聚合的方式,而不是使用继承。

简单工厂模式

1、简单工厂模式不属于 Java 23 种设计模式,需要明白的是 Java 23 种设计模式只是传统经典的23种设计模式,然后也并不仅仅只有它们23种,其它的设计模式也是设计模式。

2、简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。这里先以 简单工厂模式进行第一个入门介绍,后续会继续深入介绍 23 种设计模式。

普通简单工厂

1、建立一个工厂类,对实现了同一接口的子类进行实例的创建,关系图如下:

2、首先创建二者的共同接口:

package com.lct.simpleFactory;/*** Created by Administrator on 2019/4/7.* 发件人*/
public interface Sender {/*** 发送消息** @param message*/public void send(String message);
}

3、其次创建实现类:

package com.lct.simpleFactory;import java.util.logging.Logger;
/*** Created by Administrator on 2019/4/7.* 邮件发送者*/
public class MailSender implements Sender {protected MailSender() {}@Overridepublic void send(String message) {Logger logger = Logger.getAnonymousLogger();logger.info(message);}
}
package com.lct.simpleFactory;import java.util.logging.Logger;
/*** Created by Administrator on 2019/4/7.* 短信发送者*/
public class SmsSender implements Sender {protected SmsSender() {}@Overridepublic void send(String message) {Logger logger = Logger.getAnonymousLogger();logger.info(message);}
}

4、然后建工厂类:

package com.lct.simpleFactory;import java.util.logging.Logger;
/*** Created by Administrator on 2019/4/7.* 普通简单工厂*/
public class SendFactory {/*** 根据类型生成子类型** @param type* @return*/public Sender produce(String type) {if ("MailSender".equals(type)) {return new MailSender();} else if ("SmsSender".equals(type)) {return new SmsSender();} else {Logger logger = Logger.getAnonymousLogger();logger.warning("请输入正确的子类型...");return null;}}
}

5、最后测试如下:

package com.lct.test;
/*** Created by Administrator on 2019/4/7.*/
public class Test {public static void main(String[] args) {SendFactory sendFactory = new SendFactory();Sender sender_sms = sendFactory.produce(SmsSender.class.getSimpleName());Sender sender_mail = sendFactory.produce(MailSender.class.getSimpleName());Sender sender_other = sendFactory.produce("sms_xxx");sender_sms.send("今日高温红色预警.");sender_mail.send("点击链接激活邮件.");System.out.println(sender_other);}
}

多方法简单工厂

1、在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图如下:

2、将上面的工厂代码修改如下:

package com.lct.simpleFactory;
/*** Created by Administrator on 2019/4/7.* 普通简单工厂*/
public class SendFactory {/*** 生成邮件发送者** @return*/public Sender produceMail() {return new MailSender();}/*** 生成短信发送者** @return*/public Sender produceSms() {return new SmsSender();}
}

3、测试类如下:

package com.lct.test;import com.lct.simpleFactory.SendFactory;
import com.lct.simpleFactory.Sender;
/*** Created by Administrator on 2019/4/7.*/
public class Test {public static void main(String[] args) {SendFactory sendFactory = new SendFactory();Sender sender_sms = sendFactory.produceSms();Sender sender_mail = sendFactory.produceMail();sender_sms.send("今日高温红色预警.");sender_mail.send("点击链接激活邮件.");}
}

静态方法简单工厂

1、将上面的多个工厂方法模式里的方法置为静态的,则不需要创建工厂实例,直接调用即可。

package com.lct.simpleFactory;
/*** Created by Administrator on 2019/4/7.* 普通简单工厂*/
public class SendFactory {/*** 生成邮件发送者** @return*/public static Sender produceMail() {return new MailSender();}/*** 生成短信发送者** @return*/public static Sender produceSms() {return new SmsSender();}
}

2、测试类:

package com.lct.test;import com.lct.simpleFactory.SendFactory;
import com.lct.simpleFactory.Sender;
/*** Created by Administrator on 2019/4/7.*/
public class Test {public static void main(String[] args) {Sender sender_sms = SendFactory.produceSms();Sender sender_mail = SendFactory.produceMail();sender_sms.send("今日高温红色预警.");sender_mail.send("点击链接激活邮件.");}
}

总体来说,简单工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

Java 23 种模式后续文章将继续更新。

Java 23 种设计模式概述 与 简单工厂模式相关推荐

  1. 23种设计模式 -----Day01:简单工厂模式

    目录 前言 1.设计模式(Design pattern)定义 2.为什么要使用设计模式(使用设计模式的意义) 3.设计原则 a.单一职责原则 b.开放封闭原则 c.里氏代换原则 d.迪米特法则 e.依 ...

  2. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  3. 【23种设计模式专题】二 工厂模式

    程序猿学社的GitHub,欢迎Star github技术专题 本文已记录到github 文章目录 前言 小故事 传统方式 简单工厂(第一种) 工厂方法模式(第二种) 抽象工厂模式(第三种) 使用工厂方 ...

  4. 23种设计模式之单例模式、工厂模式、原型模式、建造者模式

    系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...

  5. 23种设计模式(2)-工厂模式

    定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达 ...

  6. Java 23种设计模式有趣见解、总结

    在网络上流畅很广的一篇旧文,暂时没找到原作者,目前所看到的最早转载时间是 2005年2月2日.作者用轻松的语言,形象解释了 23 种模式,有很好的启发作用. 创建型模式 1.FACTORY-追MM少不 ...

  7. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  8. 深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!(文末有福利)

    写在前面 在「 冰河技术 」微信公众号中[设计模式专题]更新完毕已有一段时间了.不少小伙伴在我微信上留言说:冰河,你能不能把[设计模式专题]的文章汇总成PDF文档呢?一直没有时间整理,最近在公众号后台 ...

  9. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  10. java 23种设计模式详解

    1. 软件设计模式意义 文章链接:http://c.biancheng.net/design_pattern/     设计模式的本质是对面向对象设计原则运用,是对类的封装.继承和多态以及类的关联关系 ...

最新文章

  1. IE 8兼容小妙招~~
  2. Linux学习参考书
  3. 关于NHibernate
  4. 【Python】使用 eval 实现反射
  5. 关于Python3.7和Python3.6中元组类型数据内存存储问题
  6. kotlin 查找id_Kotlin程序查找圆柱体区域
  7. python高阶_Python高阶学习
  8. andorid 回调的理解
  9. 100套PPT模板用于论文答辩、工作方案等
  10. 解决jupyter无法自动打开网页
  11. linux下使用wakeonlan远程唤醒报错:Network is unreachable at /usr/bin/wakeonlan line 126.
  12. vue路由守卫、vue-ajax请求
  13. MaskGAN:Towards Diverse and Interactive Facial Image Manipulation翻译
  14. 飞信机器人 ld-linux.so.2,飞信机器人安装
  15. dfuse 为你提供定制网络服务
  16. 中国篆刻艺术孙溟㠭作品《无有中无尽藏》
  17. 有交互作用的正交设计
  18. 计算机英语统考试卷分析,英语试卷分析
  19. WINDOWS快捷键合集
  20. 自动化生产中直线度测量仪起到的作用

热门文章

  1. Linux产生僵尸进程和孤儿进程及区别
  2. 程序员要找到自己的兴趣所在
  3. 能被3整除的Fibonacci的下标号
  4. linux文件夹权限_五分钟搞定 Linux 文档全部知识,就看这篇文章
  5. 拓端tecdat|拟合R语言中的多项式回归
  6. 拓端tecdat|R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
  7. (22)Linux下解压unrar文件
  8. 解决在使用pip进行安装时的Could not install packages due to an EnvironmentError的问题
  9. python常用的几种字符串替换函数strip、replace、sub
  10. Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2”