什么是设计模式:
- 一个问题通常有N种方法来解答,其中肯定有一种解法是
最优
的,这个最优的解法被人总结出来了,称之为设计模式
- 设计模式有20多种,对应20多种软件开发种会遇到的问题
- 是具体问题的最优解决方案
主要关注该设计模式:1. 可以解决什么问题; 2. 设计模式的写法
单例设计模式
示例:
饿汉式单例
拿对象时,对象就创建好了
- 私有类的构造器
- 定义一个类变量记住类的一个对象
- 定义一个类方法,返回对象
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class A { private static A a = new A(); private A() { } 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 { private static B b; private B() { } public static A getObject() { 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 { public final void sing() { 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