title: 设计模式
date: 2020/11/20
1.设计模式分类
创建型模式
单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式
模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
OOP七大原则
开闭原则:对扩展开放,对修改关闭
里式替换原则:继承必须确保超类锁拥有的性质在子类中仍然成立
依赖倒置原则:要面向接口编程,不要面向实现编程
单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性
接口隔离原则:要为各个类建立它们需要的专用接口
迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话
合成复用原则:尽量先试用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
2. 单例模式
2.1 饿汉式单例
//上来就加载对象,可能会浪费空间
public class Hungry {
//私有构造器
private Hungry(){
}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
2.2 懒汉式单例
public class LazyMan {
private LazyMan(){
}
//避免指令重排
private volatile static LazyMan lazyMan;
//双重检测锁模式的懒汉式单例 DCL懒汉式
public static LazyMan getInstance(){
if(lazyMan==null){
//确保LazyMan的当前对象只有一个
synchronized (LazyMan.class){
if (lazyMan==null){
lazyMan = new LazyMan();//不是一个原子性操作
}
}
}
return lazyMan;
}
}
1.3 静态内部类(单例不安全,反射)
public class Holder {
private Holder(){
}
public static Holder getInstance(){
return InnerClass.HOLDER;
}
public static class InnerClass{
private static final Holder HOLDER = new Holder();
}
}
1.4 枚举单例模式
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
class Test{
public static void main(String[] args) {
EnumSingle instance = EnumSingle.INSTANCE;
EnumSingle instance1 = EnumSingle.INSTANCE;
System.out.println(instance);
System.out.println(instance1);
}
}
3. 工厂模式
开闭原则:对扩展开放,对修改关闭(假如有A、B两个类,想扩展一个C类,要求不影响A和B)
依赖倒置原则:要面向接口编程,不要面向实现编程
迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话
核心本质
实例化对象不适用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
三种模式
简单工厂模式:用来生产同一等级结构中的任意产品(可以增加新的产品)
public class CarFactory{
//方法一
public static Car getCar(String car){
if(car.equals("五菱")){
return new WuLing();
}else if(car.equals("特斯拉")){
return new Tesla();
}else {
return null;
}
}
//
// //方法二
// public static Car getWuling(){
// return new WuLing();
// }
//
// public static Car getTesla(){
// return new Tesla();
// }
}
工厂方法模式:用来生产同一等级结构中的固定产品
抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂