一 设计模式简介
设计模式分类(三大类):
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
二 设计模式类型
1 简单工厂模式
常见案例分析:发送短信
(1)首先创建二者的共同接口
//发送接口
public interface Sender(){
public void send();
}
(2)其次,创建实现类
//邮件发送实现类
public class ZhiFuBaoService implements Sender(){
public void Send(){
System.out.println("这是邮件发送!!!")
}
}
//短信发送实现类
public class WeiXinService implements Sender(){
public void SmsSender (){
System.out.println("这是短信发送!!!")
}
}
(3)最后,创建工厂类:
public class SendFactory{
private static Map<String,PayService> payTypeMap = new HashMap<>();
static {
payTypeMap.put("1",new WeiXinService());
payTypeMap.put("2",new ZhiFuBaoService());
payTypeMap.put("3",new OtherService());
}
public static PayService getPayType(String payType){
return payTypeMap.get(payType);
}
}
测试:
public Result<?> testInfo(@Param("id") String id) { PayService payService = PayTypeFactory.getPayType(id); payService.pay(); throw new AppException("系统异常"); }
三 面试总结
1 什么是单例模式?都有哪些地方用到单例?
内存中只会创建且仅创建一次对象的设计模式,保证一个类只有一个实例,并且提供一个访问该全局访问点。
应用场景:
网站的计数器,一般也是采用单例模式实现,否则难以同步。
应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。
多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
2 单例模式都有哪些类型?
单例模式有两种类型:
- 懒汉式:在真正需要使用对象时才去创建该单例类对象
- 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用
懒汉式实现代码如下:
public class Singleton {
private static Singleton singleton;
public Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
以上代码会存在线程安全问题:如果两个线程同时判断singleton为空,那么它们都会去实例化一个Singleton对象,这就变成双例了。所以,我们要解决的是线程安全问题。
解决方法就是在方法上加锁,或者是对类对象加锁
饿汉式实现代码如下:
public class Singleton {
public static Singleton singleton = new Singleton ();
public Singleton () {
}
public static Singleton getInstance(){
return singleton;
}
}