Java进阶23种设计模式详解+应⽤+实例代码
⽂章⽬录
前⾔
Java的 23种设计模式
创建型模式,共五种(1-5):⼯⼚⽅法模式、抽象⼯⼚模式、单例模式、⽣成器模式、原型模式。
结构型模式,共七种(6-12):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
⾏为型模式,共⼗⼀种(13-23):策略模式、模板⽅法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式
设计模式六⼤原则
1.单⼀原则
(1) 概念
⼀个类只负责⼀个功能领域中的相应职责,或者可以定义为:就⼀个类⽽⾔,应该只有⼀个引起它变化的原因。
(2) 优点
可以降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单的多;
提⾼类的可读性,提⾼系统的可维护性;
变更引起的风险降低,变更是必然的,如果单⼀职责原则遵守的好,当修改⼀个功能时,可以显著降低对其他功能的影响
2.开闭原则
(1) 概念
⼀个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进⾏扩展
3.⾥⽒替换原则
(1) 概念
所有引⽤基类的地⽅必须能透明地使⽤其⼦类的对象。
4.依赖倒置原则
(1) 概念
⾼层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,其核⼼思想是:要⾯向接⼝编程,不要⾯向实现编程。
(2) 作⽤
依赖倒置原则可以降低类间的耦合性。
依赖倒置原则可以提⾼系统的稳定性。
依赖倒置原则可以减少并⾏开发引起的风险。
依赖倒置原则可以提⾼代码的可读性和可维护性。
5.接⼝隔离原则
(1) 概念
使⽤多个专门的接⼝,⽽不使⽤单⼀的总接⼝,即客户端不应该依赖那些它不需要的接⼝。
6.迪⽶特原则
(1) 概念
⼀个软件实体应当尽可能少地与其他实体发⽣相互作⽤。
⼀、单例模式
1.概念
java中单例模式是⼀种常见的设计模式,单例模式的写法有好⼏种,这⾥主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。
单例模式有以下特点:
1. 单例类只能有⼀个实例。
2. 单例类必须⾃⼰创建⾃⼰的唯⼀实例。
3. 单例类必须给所有其他对象提供这⼀实例。
2.单例模式应⽤
(1) 懒汉式基础版
// 懒汉式单例类先声明在第⼀次调⽤的时候实例化⾃⼰
public class Idler {
// 构造⽅法
private Idler (){}
private static Idler idler ;
// 静态⼯⼚⽅法
public static Idler getIdler (){
if(idler ==null){
idler=new idler();
}
return idler;
}
}
(2) 懒汉式双重校验锁版
防⽌多线程创建单例模式时 造成多次被实例化
// 懒汉式单例类先声明在第⼀次调⽤的时候实例化⾃⼰
单例模式的几种实现方式public class Idler {
// 构造⽅法
private Idler (){}
private static Idler idler ;
// 静态⼯⼚⽅法
public static Idler getIdler (){
if(idler ==null){
synchronized(Idler.class){
if(idler ==null){
idler=new idler();
}
}
}
return idler;
}
}
(3) 饿汉式单例模式
饿汉式在类创建的同时就已经创建好⼀个静态的对象供系统使⽤,以后不再改变,所以天⽣是线程安全的。
// 饿汉单例类初始化时实例化⾃⼰
public class Idler {
// 构造⽅法
private Idler (){}
private static Idler idler =new idler();
// 静态⼯⼚⽅法
public static Idler getIdler (){
return idler;
}
}
(4) 登记式单例模式
package创建型_单例模式_登记式;
import HashMap;
import Map;
/**
* 登记式单例实际上维护的是⼀组单例类的实例,将这些实例存储到⼀个Map(登记簿) * 中,对于已经登记过的单例,则从⼯⼚直接返回,对于没有登记的,则先登记,⽽后 * 返回
* @author pp
*
*/
public class Example{
/**
* 登记簿,⽤来存放所有登记的实例
*/
private static Map<String, Example> map =new HashMap<String, Example>(); //在类加载时添加⼀个实例到登记簿
static{
Example example=new Example();
map.Class().getName(), example);//运⽤了反射
}
/**
* 受保护的默认构造⽅法
*/
protected Example(){
}
/**
* 静态⼯⼚⽅法,返回指定登记对象的唯⼀实例
* 对于已经登记的直接取出返回,对于还未登记的先登记,然后取出返回
*
*/
public static Example getExample(String name){
if(name ==null){
name="firstExample";
}
(name)==null){
try{
map.put(name,(Example) Class.forName(name).newInstance());
}catch(Exception e){
e.printStackTrace();
}
}
(name);
}
}
⼆、策略模式
1.概念
其思想是针对⼀组算法,将每⼀种算法都封装到具有共同接⼝的独⽴的类中,从⽽使它们可以相互替换。策略模式可以让算法在不影响客户端的情况下发⽣变化
2.策略模式应⽤(导航不同⼯具耗时为例)
(1) 创建策略接⼝
/**
* 导航接⼝
* 导航策略接⼝
*/
public interface Navigation {
// 耗时⽅法
void elapsedTime();
}
(2) 创建不同⽅式导航策略
/**
* 步⾏导航⽤时⽅法
*/
public class Walk implements Navigation {
@Override
// 步⾏导航消耗时间⽅法
public void elapsedTime(){
System.out.println("步⾏到达⽬的地需20分钟");
}
}
/**
* 骑车导航⽤时⽅法
*/
public class Bike implements Navigation {
// 骑车导航耗时⽅法
@Override
public void elapsedTime(){
System.out.println("骑车到达⽬的地需10分钟");
}
}
public class Car implements Navigation {
// 骑车导航耗时⽅法
@Override
public void elapsedTime(){
System.out.println("开车到达⽬的地需2分钟");
}
}
(3) 创建策略上下⽂
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论