- 什么是设计模式?
重构是为了改善我们的代码,那在改善的过程中我们需要一些指导思想,编码原则,编码方法,我们还需要设计模式的知识。如果把编写程序比作打仗,那设计模式就是战争中的三十六计、孙子兵法。可以把设计模式理解为编写软件的高级算法。 - 设计模式的种类
2.1 根据功能不同
2.2 细分
3. 单态模式
普通的 Java 类可以创建无数个对象,但是有些情况下某个类我们只需要创建一个对象,并且只能最多创建这一个对象,这样需要使用单态模式。
使用单态模式的场景如 C/S 结构应用程序中客户端到数据库服务器的链接,里一个客户端只需要建立一个到数据库服务器的链接对象,即一个nection 对象,这里我们可以使用单态模式。我们把使用单态设计模式的类称为单态类 。
3.1单态分类
(1) 饿汉单态类(自己太饿了所有自己提前创建了对象,别人调用只返回此对象)
(2)懒汉单态类(自己太懒了不想创建,不然调用时才创建对象)
大家想想静态变量的一些知识,静态变量又称为类变量,是系统在加载类时就会初始化的,这样假设我们项目运行过程中很少使用 God 对象,有时可能根本用不到,上面的写法显然占用了较多的内存空间懒汉式单态类就可以解决这样的问题
3.2 单态实现
比如上帝是个类,但只有一个上帝,也就是只有一个对象,可以使用单态模式。
首先我们创建类 God,并且它的构造方法是私有的,也就是外部不能 new创建。
构造方法私有,外部不能创建,那客户端又要使用它,只能自己内部定义方法创建,并且既然外部无法创建,更不能调用对象普通方法,所以可以将创建此对象的方法定义为静态方法:
3.2.1:懒汉单态类
public class LazyGod {
private static LazyGod god = null;
private LazyGod() {
}
public synchronized static LazyGod getGod() {
if (god == null) {
god = new LazyGod();
}
return god;
}
}
3.2.2 饿汉单态类
public class HungaryGod {
private static HungaryGod god = new HungaryGod();
private HungaryGod() {
}
public static HungaryGod getGod() {
return god;
}
}
两种方式比较:
饿汉式单态类在自己被加载时就将自己实例化。
单从资源利用效率角度来讲, 饿汉式比懒汉式单态类稍差些。
从速度和反应时间角度来讲, 饿汉式比懒汉式单态类稍好些。
3.2.3 静态内部类实现模式(线程安全,调用效率高,可以延时加载)
public class Singleton{
private static class SingletonInnerClass {
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonInnerClass.instance;
}
}
3.2.4 使用枚举来实现单例
public enum Singleton {
//枚举元素本身就是单例
INSTANCE;
//添加自己需要的操作
public void singletonOperation(){
}
}
- 工厂方法()
工厂方法的目的是分离对象的创建和使用。我们要得到一个对象的目的是使用它,但往往要耗费很大的精力创建它,比如有时需要给对象初始化等操作。工厂模式分离对象的创建和使用,客户端只负责使用,对象由工厂类创建。