JAVA设计模式总结

一、设计模式的原则(设计模式的依据)

1.1、单一职责原则:

对类来说,一个类只负责一项职责。降低类的复杂度,提高类的可读性,可维护性,降低变更引起的风险。

1.2、接口隔离原则:Interface Segregation Principle

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
多个类实现同一个接口,可能会出现接口中所有的方法不都是每一个类都需要的,但是却必
须实现。所以,拆接口,拆成多个小的接口。实现接口隔离。

1.3、依赖倒置原则:Dependence Inversion Principle

高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不该依赖细节,细节应该依赖抽象。依赖倒置中
心思想是面向接口编程。相对于细节的多变性,抽象东西要稳定的多。以抽象为基础搭建成来的架构要比以细
节为基础搭建的架构稳定的多。在Java中抽象指的就是接口或者抽象类,细节就是实现类。
方式一:通过接口传递依赖
方式二:通过构造方法传递依赖
方式三:通过setter方法传递依赖

1.4、里氏替换原则

针对继承而言,所有引用基类的地方必须能透明的使用其子类的方法。子类中尽量不要重写父类的方法。
继承实际增强了两个类的耦合性,在适当的情况下,可以通过聚合,组合,依赖来解决该问题。

1.5、开闭原则(Important)

重要。一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
当软件需要变化时,尽量通过扩展软件实体来实现变化,而不是通过修改已有的代码来实现变化。编程中
遵循其他原则,以及使用设计模式的目的就是遵循开闭原则。

1.6、迪米特法则(最少知道原则)

一个对象应该对其他对象保持最少的了解。类和类关系越密切,耦合度越大。一个类对自己依赖的类知道的
越少越好,对于被以来的类无论多么复杂,都尽量将逻辑封装在类的内部,对外除了提供public方法,不对外
泄露任何信息。只与直接耦合的对象进行通信。耦合关系有依赖,关联,组合,聚合等。出现在成员变量,方
法参数,方法返回值中的类为直接耦合。
细节:降低依赖关系,而不是完全没有依赖关系是不可能的。

1.7、合成复用原则

原则是尽量使用合成、聚合的方式,尽量减少继承的使用。

二、UML类图

2.1、用于描述系统中(对象)本身的组成和类(对象)之间的各种静态关系。类之间的关系:依赖,
泛化(继承),实现,关联,聚合,组合。

在这里插入图片描述
解释:

车的类图结构为<<abstract>>,表示车是一个抽象类;
它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
学生与班级之间是聚合关系,使用带空心箭头的实线表示;
学生与身份证之间为关联关系,使用一根实线表示;
学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;

三、设计模式正篇

3.1、创建型模式

3.1.1 单例模式

(1)饿汉式---静态常量/静态代码块,线程安全
		步骤:构造器私有化,在类的内部创建对象,向外暴露一个静态公共方法。
		优点:写法简单,在类装在的时候就完成实例化。避免线程同步问题。
		缺点:没有达到懒加载,可能造成内存浪费。
		结论:线程安全,可能造成内存浪费。

(2)懒汉式---线程不安全
		步骤:调用方法时才去创建。首先判断是否有实例,然后返回对象。
		结论:线程不安全,不可用。
		
(3)同步方法---线程安全(懒汉式一种),
		步骤:在方法上加锁,synchronized。
		结论:线程安全,可用,但是效率低,不推荐使用。
		
(4)同步代码块---线程不安全(懒汉式一种),
		步骤:在null判断中对对象添加synchronized。
		结论:线程不安全,不可用。
		
(5)双重检查(推荐):线程安全
		步骤:volatile修饰对象,使变化可见,先判断是否为空,然后锁对象class,再判断是否为空,
		再创建对象。
		结论:线程安全,解决了上面的问题。推荐使用。
		
(6)静态内部类(推荐):线程安全
		步骤:构造器私有化,类中添加一个静态内部类,类中有一个静态属性并已经初始化的单例外部类对
		象。外部类对外提供获取方法。
		结论:外部类装载的时候,内部静态类不会装载。在调用getInstance()时,才装载这个类,且只加载
		一次,实现懒加载。JVM在加载类的时候是线程安全的。
		
(7)枚举:(推荐):线程安全
	步骤:
		enum Singleton { INSTANCE;}
	结论:线程安全,但不可反射获取。

使用场景:
	需要频繁创建和销毁对象,创建对象时耗时过多或耗费资源过多,但又经常用到的对象,工具类对象,
	频繁访问数据库或文件的对象(比如数据源,session工厂等)。
	JDK中Runtime类用到的是饿汉式静态常量方式。

3.1.2 工厂模式

3.2、结构型模式

3.3、行为型模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值