统一建模语言UML
类之间关系
泛化 实线 △
当一个类表示多个类的共享特征,这称为泛化,例如 交通工具是自行车、电动车、高铁的泛化
实现 虚线△
定义一组接口,然后去实现该接口的所有方法
依赖 虚线 箭头
一个类依赖于另一个类
关联 实线 箭头
表示两个实体间的关系,有组合和聚合
聚合 实线 白菱形
狼群
组合 实线 黑菱形
轮子和车
设计模式原则
单一职责原则
该原则指出,软件模块应该只有一个被修改的理由,说白了就是我维护一个bug,不会影响其他代码
开闭原则
模块,类,函数应该对扩展开放,对修改关闭。开发的软件正在构建一个复杂的结构,一旦我们完成了它的一部分,不应该再修改他,而是应该在他的基础上继续构建。因此最好的办法是尝试在完成后保持模块不变,并通过继承和多态拓展来添加新功能,开闭原则是最重要的设计原则之一,是大多数设计模式的基础!
里氏替换
派生类型必须完全可替代其基类型
例如有一个车的对象,他可以在代码中用作交通工具
例如车和巴吉赛车,因为巴吉赛车是没有锁的,所以他继承车的时候要重写锁这个方法,即使是返回提示该车没有锁,也需要实现。
接口隔离
客户端不应该依赖于他所不需要的接口
减少代码偶合
假如汽车有修理和出售成员方法可以分别实现修理和出售两个接口而不是两个接口放一起,这样修理工可以实现修理这个接口,传入交通工具形参(实现可修理接口),销售员实现出售接口形参产品(实现可销售接口的类)
依赖倒置
高级模块不应该依赖低级模块,两者都应该依赖抽象,抽象不应该依赖于细节,细节应该依赖于抽象。
将高级逻辑和低级模块分开,依赖程度越低,维护和扩展系统就越容易
我们还是举汽车的例子,可以将修理车,调试车,出售车等方法放置到一个交通工具服务接口中,然后交通工具去实现这个高级逻辑接口。
创建型模式
单例模式 singleton pattern
单例模式的实现非常简单,只有单个类组成,为确保单例实例的唯一性,所有的单例构造器都要被声明为私有的,再通过声明静态方法实现全局访问,获得该单例实例。
饿汉式(可用)
public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } }
同步方法懒汉式(可用)
防止多线程同时调用getInstance方法,
所以需要保证线程安全
1,getInstance方法声明中添加synchronized关键字
public class Singleton { private static Singleton instance = null; private Singleton() { } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2,用synchronized代码块包装 if(instance==null)条件。在这一环境中使用synchronized代码快时,需要指定一个对象来提供锁,Singleton.class对象就是这种作用,synchronized(Singleton.class){
if(instance==null)
instance=new Singleton();
}
双重检查懒汉式(可用,推荐)
前面的实现方式能够保证线程安全,但同时带来了延迟,
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
工厂模式
简单工厂
工厂模式用于实现逻辑的封装,并通过公共的接口提供对象的实例化服务,再添加新的类型,只需要做少量的修改
静态工厂
public class VehicleFactory public enum VehicleType { Bike, Car, Truck; } public static Vehicle create(VehicleType type){ if (type. equals (VehicleType. Bike)) return new Bike(); if (type. equals(VehicleType. Car)) return new Car(); if (type. equals(VehicleType. Truck)) return new Truck(); else return null; } }
反射机制进行类注册的简单工厂
使用newInstance方法进行注册的简单工厂
重写newInstace方法
工厂方法模式(由工厂负责实例化对象)
有个抽象的工厂,有抽象的实例方法由具体工厂重写。比如我们有一个造交通工具的工厂,经过市场调查卡车的需求量很大,所以我们建了一个卡车的工厂去继承抽象工厂并重写实例化方法
public abstract class VehicleFactory { protected abstract Vehicle createVehicl(String item); public Vehicle orderVehicle(String size, String color){ Vehicle vehicle= createVehicle(size); vehicle. testVehicle(); vehicle. setColor(color); return vehicle; } }
匿名具体工厂
接上面也可以不需要新建类,在抽象工厂中写匿名类实现
VehicleFactory bikeFactory= new VehicleFactory() { @Override protected Vehicle createvehicle(String size) { if (size. equals ("small")) return new MountainBike(); else if (size. equals("large")) return new CityBike(); return null; }; bikeFactory. orderVehicle ("large", "blue");
抽象工厂模式(多类实现同一组抽象行为)
有个抽象类有生产风扇,空调等接口
有个格力的工厂继承这个类重写这些接口
缺点是如果抽象类要造洗衣机,那么要修改所有实现类
建造者模式(构建复杂类)
汽车的类非常复杂,我们需要构建多种类型的汽车,通过构造函数显然不方便
原型模式(克隆对象)
使用场景:依赖外部资源或硬件密集型操作
获取相同对象在相同状态的拷贝
不确定所属具体类时
浅拷贝 深拷贝
对象池模式(数据池原理)
行为型模式
责任链模式
servlet dofilter过滤器
命令模式
场景:
撤销/重做操作
组合命令
异步调用 。如:Runnable
解释器模式(java正则表达式解释类)
例如:java中的 java。until。Pasrer
用于解释正则表达式
迭代器模式(java.util.Iterator和java.util.Collection)
当我们需要具体特定行为的容器时,应该考虑扩展collection包的一个实现类,而不是创建新类
Iterator
观察者模式(对象状态改变,登记的其他对象可以看到)
中介者模式(封装一组对象的交互,减少之间依赖)
备忘录模式(保存对象状态,以便于恢复)
新建一个类带有记录状态的final修饰的成员变量
模板方法(抽象类-开放的抽象方法)
访问者模式(利于扩充不通访问者)
结构型模式
适配器模式
JDK中的 InputStreamReader和OutputTreamwriter
目的:将旧的接口转换成新的客户端接口,重用代码
本文介绍了UML中的类关系,包括泛化、实现、依赖、关联和聚合。接着讨论了设计模式的一些基本原则,如单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。接着详细阐述了几种常见的创建型设计模式,如单例模式的多种实现方式,以及工厂模式的不同形式。最后提到了一些其他设计模式,如责任链模式、迭代器模式和观察者模式等。

被折叠的 条评论
为什么被折叠?



