面试中常问到的设计模式
什么是设计模式?
设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸
单例模式
保证被创建一次,节省系统开销
饿汉式:上来不管有没有对象,都要直接创建一个新的对象。
懒汉式:首先判断有没有创建对象,如果创建对象了就使用原来创建的对象,没有创建的话新创建一个对象。
1)单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。Java.lang.Runtime
是单例模式的经典例子。从 Java 5 开始你可以使用枚举(enum) 来实现线程安全的单例。(据测试,使用枚举是单例模式最完美的一中写法)
观察者模式
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
1)观察者模式是基于对象的状态变化和观察者的通讯,以便他们作出相应的操作。简单的例子就是一个天气系统,当天气变化时必须在展示给公众的视图中进行反映。这个视图对象是一个主体,而不同的视图是观察者。
2)马士兵老师讲的小孩子哭例子,几个观察者(爸爸、妈妈、小狗)观察小孩子,小孩子一开始哭,不同观察者响应的不同方式,爸爸给小孩子喂奶粉,妈妈抱小孩子,小狗汪汪叫。
工厂模式
解耦代码。
1)工厂模式的最大好处是增加了创建对象时的封装层次。如果你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。
2)下面是对普通工厂举例说明:
1.创建公共接口
public interface Sender {
public void send();
}
2.创建两个实现类
public class sendQQ implements Sender {
@Override
public void send() {
System.out.println("使用QQ开始发送消息...");
}
}
public class sendWeChat implements Sender {
@Override
public void send() {
System.out.println("使用微信开始发消息...");
}
}
- 创建一个工厂
public class SendFactory {
public Sender produce(String type){
if("QQ".equals(type)){
return new sendQQ();
}else if ("WeChat".equals(type)){
return new sendWeChat();
}else{
System.out.println("输入类型有误!");
return null;
}
}
}
- 使用工厂测试
public class FactoryTest {
public static void main(String[] args) {
SendFactory sendFactory = new SendFactory();
Sender qq = sendFactory.produce("WeChat");
qq.send();
}
}
工厂模式分类
1)简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。
2)工厂方法:用来生产同一等级结构中的固定产品,支持增加任意产品。
3)抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族
装饰者模式
装饰模式增加强了单个对象的能力。Java IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如BufferedReader
和BufferedWriter
,它们增强了Reader
和Writer
对象,以实现提升性能的 Buffer 层次的读取和写入。
参考来源:https://zhuanlan.zhihu.com/p/94767927
未完待续···