第一次写设计模式,如果写错了,请指正,虚心学习,一起进步
什么是设计模式?
- 定义:
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。
- 简单来说:
在某些场景下,针对某类问题的某种通用的解决方案。
1.场景:项目所在的环境
2.问题:约束条件,项目目标等
3.解决方案:通用、可复用的设计,解决约束达到目标。
设计模式有哪些分类?
类型 | 说明 |
---|---|
创建型模式 | 对象实例化的模式,创建型模式用于解耦对象的实例化过程。 |
结构性模式 | 把类和对象结合起来构建成一个更大的结构 |
行为型模式 | 类和对象如何交互,及划分责任和算法。 |
1.单例模式
- 什么是单例模式
创建一个类,该类只有一个实例对象,提供一个全局的访问点,这样可以避免资源的浪费
- 如何实现一个类只有一个实例对象呢?我们使用代码来解说
class Singleton{
//1.构造方法私有化,这样就无法直接通过new关键字来实例化对象了
private Singleton(){
}
private static Singleton singleton=new Singleton();//2.定义一个静态变量,实现只有一个
//3.提供方法获取对象实例
public static Singleton getIntacne(){
return singleton;
}
}
- 单例模式中的饿汉式和懒汉式
- 饿汉式
1.我们直接从翻译来的字面意思理解一下,因为名字可以代表一些思想.饥饿说明一个人饿的很着急,急需食物,碰到食物就会吃,所以其核心当我们获取单例对象时,直接返回一个对象实例,只要调用getIntacne()方法就返回实例对象,下面是代码:
class SingletonHunger{
//1.构造方法私有化
private SingletonHunger(){
}
private static SingletonHunger singletonHunger=new SingletonHunger();
public static SingletonHunger getIntacne(){
return singletonHunger;
}
}
- 懒汉式
1.也是直接从名字来解释一波,就一个字懒,那怎么样才可以让程序懒呢?当调用方法获取实例对象时,我们会先判断实例对象是否为null,如果是null,那么创建一个实例对象返回,如果有了,那就直接返回已经有的实例对象,类似有了我就懒的创建了,直接返回就行了,代码实现:
class SingletonLazy{
//1.构造方法私有化
private SingletonLazy(){
}
private static SingletonLazy singletonLazy=null;
public static SingletonLazy getIntacne(){
if (singletonLazy==null){
singletonLazy=new SingletonLazy();
}
return singletonLazy;
}
}
2.懒汉式是线程不安全的,因为当多线程时会创建多个实例对象,我们来说明一下:
线程A调用getIntacne()方法时,首先判断null,结束后,此时因为种种原因,阻塞了,OK,这个时候线程B开始执行了,也是先判断null,然后发现为null,创建了一个实例对象,此时线程A阻塞状态结束,开始执行,又会创建一个实例对象,所以针对这个bug,我们可以加同步锁:改进代码:
class SingletonLazy{
//1.构造方法私有化
private SingletonLazy(){
}
private static SingletonLazy singletonLazy=null;
public static synchronized SingletonLazy getIntacne(){
if (singletonLazy==null){
singletonLazy=new SingletonLazy();
}
return singletonLazy;
}
}
总结:
懒汉式 | 饿汉式 |
---|---|
时间换空间 | 空间换时间 |