设计模式
- 什么是设计模式
软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案
- 设计模式原则
- 开闭原则——对扩展开放,对修改封闭
- 里氏代换原则——任何基类出现的地方,子类都可以出现。开闭原则的补充。
- 依赖倒转原则——针对接口编程,高层模块不依赖底层模块,二者都依赖抽象而不依赖具体。
- 接口隔离原则——使用多个隔离的接口,不应使用单个庞大的接口。
- 单一职责原则——类的职责要单一。
- 迪特米原则——也称最少知道原则,一个实体与其他实体的相互作用越少越好,功能模块相对独立。
- 合成复用原则——多使用 组合/聚合 的方式,尽量少使用甚至不使用继承关系。
- 工厂模式的理解
在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
打个比方,富士康工厂的苹果手机生产车间可以生产iPhone8和iPhone8Plus,苹果公司给出指令说要iPhone8,那工厂就生产iPhone8;给出指令说要iPhone8Plus,那工厂就生产iPhone8Plus。苹果公司的客户端,工厂是接口,生产车间是父类,生产iPhone8和iPhone8Plus的两条流水线是子类,也是具体的实现类。客户端调用接口的方法,接口里返回子类的方法。
- 工厂模式通常分为:
- 普通工厂模式
- 多个工厂方法模式
- 静态工厂方法模式
大多数情况下,选用工厂方法模式,因为方法置为静态的,不需要创建实例,不需要实例化工厂类 ,可以直接调用。
- 抽象工厂模式
抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂是“工厂的工厂”。
- 工厂方法模式、抽象工厂模式区别
产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 A厨房 生产苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 B厨房 可能生成另一组产品,如牛奶、杯子。
因此工厂方法模式、抽象工厂模式最大的区别在于:
工厂方法模式:针对 一个产品等级结构。
抽象工厂模式:针对 多个产品等级结构。
- 装饰者模式
装饰者模式(Decorator Pattern,有的也用 Wrapper Pattern)就是动态地把职责附加到已有对象上去,实现功能扩展。
Java IO 类中有一个经典的装饰者模式应用, BufferedReader 装饰了 InputStreamReader.
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
- 观察者模式
观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。也被称为 “模型-视图”模式、“源-监听者”模式。是由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。
- 单例模式
一个类能返回对象的一个引用(永远是同一个)和一个获得该唯一实例的静态方法(必须是静态的)。通过单例模式,可以保证系统中只有一个实例,从而在某些特定的场合下达到节约或者控制系统资源的目的。
- 静态内部类实现单例模式
// 静态内部类
public class Human{
private static class HumanInnerClass{ //HumanInnerClass 是私有的,只有getHuman()才能访问实例对象
private static final Human human = new Human();
}
private Human();
public static Human getHuman(){ //只有调用getHuman()才会创建Human的实例对象
return HumanInnerClass.human;
}
}
- 枚举实现单例模式
创建枚举默认是线程安全的,并且可以防止反序列化带来的问题。( 自由序列化,线程安全,保证单例)
public enum Human{
INSTANCE;
// 自定义的其他任意方法
public void otherMethod() { }
}
可以通过Human.INSTANCE来访问实例对象。《Effective Java》里有句话:单元素的枚举类型已经成为实现Singleton的最佳方法。