什么是设计模式:

  • 一个问题通常有N种方法来解答,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式
  • 设计模式有20多种,对应20多种软件开发种会遇到的问题
  • 是具体问题的最优解决方案

主要关注该设计模式:1. 可以解决什么问题; 2. 设计模式的写法

单例设计模式

  • 确保一个类只有一个对象

示例:

  • 饿汉式单例
  • 懒汉式单例
饿汉式单例

拿对象时,对象就创建好了

  • 私有类的构造器
  • 定义一个类变量记住类的一个对象
  • 定义一个类方法,返回对象

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class A {
//2. 定义一个类变量记住类的一个对象
private static A a = new A();
//1. 必须私有类的构造器
private A() {

}
//3. 定义一个类方法,返回对象
public static A getObject() {
return a;
}
}

单例设计模式的应用场景

查看Java的Runtime类源码。Java在运行时候,只有一套运行环境,所以该Runtime类只需要一个对象。

电脑的任务管理器也是单例模式,由于任务管理器只需要一个窗口来显示,创建多个也没有意义还占用电脑的内存影响性能。所以也做成单例模式来优化避免浪费内存。

懒汉式单例

拿对象时,对象才开始创建

写法:

  • 私有类的构造器
  • 定义一个类变量记住类的一个对象
  • 定义一个类方法,保证返回的是同一个对象

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class B {
//2. 定义一个类变量记住类的一个对象
//和饿汉式单例不同的是,先不在此处创建对象
private static B b;
//1. 必须私有类的构造器
private B() {

}
//3. 定义一个类方法,该方法保证第一次调用时才会创建一个对象
//后面调用时都会使用同一个对象返回
public static A getObject() {
//当b == null时代表还没有创建b对象,是第一次创建对象
if (b == null) {
b = new B();
}
return b;
}
}
总结

当该对象被频繁的使用时候,使用饿汉式单例。如果一个对象使用次数用的不多则可以使用懒汉式单例。

模板方法设计模式

模板方法模式主要解决方法中存在重复代码的问题

示例:

如我们所见,在A类和B类中存在很多相同的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A {
public void sing() {
System.out.println("选一首你喜欢的歌");
System.out.println("我是一只小小小小鸟...");
System.out.println("播放完毕");
}
}

public class B {
public void sing() {
System.out.println("选一首你喜欢的歌");
System.out.println("倘若那天...");
System.out.println("播放完毕");
}
}

我们定义一个父类,同时将相同的代码都保留下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//模板方法设计模式
public abstract class C {
//该方法会变成模板方法,同时建议使用final修饰该方法
//模板方法是不能够被子类重写的
public final void sing() {
System.out.println("选一首你喜欢的歌");
//去掉不同的:System.out.println("倘若那天...")
doSing();
System.out.println("播放完毕");
}

//定义抽象方法
public abstract void doSing();
}

之后我们需要将A类B类继承C类,同时重写方法

1
2
3
4
5
6
7
8
9
10
11
12
public class A extends C {
@Override
public void doSing() {
System.out.println("我是一只小小小小鸟...");
}
}
public class B extends C {
@Override
public void doSing() {
System.out.println("倘若那天...");
}
}

扩展:java中DateFormat类使用的是模板方法设计模式

链接

封面图来源:https://www.pixiv.net/artworks/104627190