# 设计模式概述
## 概念
解决某一问题最行之有效的方法,共有23种设计模式
# 单例设计模式
## 单例作用
使一个类在内存中只存在一个对象
## 单例——饿汉式
```java
//特点是先初始化对象。如:Single类一进内存,就已经创建好了对象。在实际开发中,出于安全考虑,建议使用饿汉式
class Single
{
private Single(){};
private static Single s = new Single();
public static Single getInstance()
{
return s;
}
}
```
## 单例——懒汉式
```java
// 特点对象是方法被调用时,才初始化
// 这也叫对象的延时加载
// 如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s == null)
s = new Single();
return s;
}
}
```
## 单例——懒汉式改进
```java
//懒汉式在多线程操作时会出现安全隐患,以下写出解决安全隐患的代码,但代码繁琐,建议使用饿汉式
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
//判断是否为空,以确定执行同步代码块,提高效率
if(s==null) {
//将判断和赋值动作封装在同步代码块中,保证多线程安全
synchronized(Single.class)
{
//判断是否为空,防止某线程在刚刚判断完上一个if语句而失去了执行权,导致的线程安全问题
if(s==null)
s = new Single();
}
}
return s;
}
}
```
# 模版方法设计模式
## 模板方法简述
在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成
## 模板方法代码
```java
//该设计模式在使用时,建立子类对象,调用子类继承自父类的getTime()
abstract class GetTime
{
//计算某段代码运行完成所需时间
//该方法不能被读写所以定义为final
public final void getTime()
{
long start = System.currentTimeMillis();
run();//调用需要计算时间的运行代码
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒");
}
//要运行的代码不确定,定义为抽象由子类去实现
//该方法不一定抽象,也可能有默认方式,如果觉得默认的不行可以复写
//设计模式是一种思想,主要理解思想
public abstract void run();
}
class SunGetTime extends GetTime
{
//复写父类的run方法
public void run()
{
for(int i = 0; i<1000; i++)
{
System.out.print(i);
}
}
}
```
-separator-