设计模式
共有23中设计模式,Gof23。
-
GoF23
-
一种思维,一种态度,一种进步
-
-
创建型模式:(描述怎么创建一个对象)
-
-
结构型模式:(描述类或对象按照某种布局组成一些更大的结果)
-
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
-
-
行为型模式:(描述类或者对象之间怎么相互协作去共同完成单个对象无法完成的工作)
-
模板方法模式,命令模式,迭代器模式,观察者模式,中介模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式
-
OOP七大原则(面向对象)
-
开闭原则:对扩展开放,对修改关闭
-
对一个类添加方法的时候,要避免修改这个类中之前的方法
-
-
里氏替换原则:继承必须确保超类所拥有的的也行在子类中仍然成立
-
不要修改父类中的方法,可以在子类中添加方法
-
正方形不是长方形
-
-
依赖倒置原则:要面向接口编程,不要面向实现编程
-
面向接口编程
-
抽象不依赖细节,细节依赖抽象
-
降低程序之间的耦合性
-
-
单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性
-
一个方法尽可能干好一件事情
-
原子性
-
-
接口隔离原则:要为各个类建立他们需要的专用接口
-
降低耦合
-
-
迪米特法则:只与你的直接朋友交谈,不跟”陌生人“说话
-
合成复用原则:尽量先使用组合或者聚合等关联关系来实现,期次才考虑使用继承关系来实现
创建型模式
单例模式
不要new对象
只要是单利模式一定构造器私有
-
恶汉式单例
初始化的时候就把类中所有的资源都加载到内存中,比较浪费资源
package com.wx.single;
/**
* @BelongsProject: wxStuSCB
* @BelongsPackage: com.wx.single
* @Author: wangxiang
* @CreateTime: 2022-10-18 12:04
* @Description: 恶汉式单列
* @Version: 1.0
* 浪费内存
*/
public class Hungry {
//可能会浪费空间
private byte[] bytes1 = new byte[1024*1024];
private byte[] bytes2 = new byte[1024*1024];
private byte[] bytes3 = new byte[1024*1024];
private byte[] bytes4 = new byte[1024*1024];
private Hungry(){
}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
-
DCL懒汉式单例
-
使用的时候进行创建
-
双重检测锁的模式
package com.wx.single;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @BelongsProject: wxStuSCB
* @BelongsPackage: com.wx.single
* @Author: wangxiang
* @CreateTime: 2022-10-18 12:09
* @Description: 懒汉式单列模式
* @Version: 1.0
*/
public class LazyMan {
private static boolean wx = false;
private LazyMan(){
synchronized (LazyMan.class){
if (!wx){
wx = true;
}else {
throw new RuntimeException("不用试图使用反射破坏");
}
}
}
private volatile static LazyMan lazyMan;
//普通模式
public static LazyMan getInstance1(){
if (lazyMan==null){
lazyMan = new LazyMan();
}
return lazyMan;
}
//双重检测锁的模式 懒汉式单列 DCL懒汉式
public static LazyMan getInstance(){
if (lazyMan==null){
synchronized (LazyMan.class){
if (lazyMan==null){
lazyMan = new LazyMan();//不是一个原子性操作
/**
1、分配内存空间
2、执行构造方法,初始化对象
3、把这个对象指向这个空间
理想情况下会按照1、2、3这个顺序执行
但是多线程下可能会有问题
A线程:按照1、3、2这个执行顺序执行了,指令重排
B线程:A线程在执行到第3步的时候lazyMan这个对象在内存空间中是有值的所以不是null,
但是这个时候A线程还没有执行第2步初始化操作,所以会有问题
解决方法:添加volatile关键字修饰
*/
}
}
}
return lazyMan;
}
//单线程下没问题
//多线程下会有问题
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
// for (int i = 0; i <10 ; i++) {
// new Thread(()->{
// getInstance();
// }).start();
// }
LazyMan instance = LazyMan.getInstance();
Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
//忽略私有构造器
declaredConstructor.setAccessible(true);
LazyMan instance2 = declaredConstructor.newInstance();
System.out.println(instance);
System.
-