单例模式
单例设计模式的一般定义:一个类中只允许有一个实例
实现思路:让类的构造方法私有化,同时提供一个静态方法来实例这个类。
对单例的实现可以分为两大类— — 懒汉式和饿汉式,他们的区别在于:
- 懒汉式:指全局的单例实例在第一次被使用时创建
-
懒汉式:在静态方法中初始化。时间换空间。(不推荐,时间很重要)
-
饿汉式:指全局的单例实例在类装载时构建
- 饿汉式:在声明对象就初始化。空间换时间。(推荐,空间不是问题)
代码:
//懒汉式
public class Single {
/*volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有
一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作。*/
private static volatile Single instance;
//构造器私有,可以防止外部类的调用
private Single() {}
/*如果有两个线程(T1、T2)同时执行到这个方法时,会有其中一个线程T1获得同步锁,得以继续执行,
而另一个线程T2则需要等待,当第T1执行完毕getInstance之后(完成了null判断、对象创建、获得返
回值之后),T2线程才会执行执行。*/
public static Single getInstance() {
//效率问题,只有instance为null的时候,才能进入synchronized的代码段
if (instance == null) {
//多线程可能导致问题,加上同步锁
synchronized (Single.class) {
//防止出现多个实例
if (instance == null) {
instance = new Single();
}
}
}
return instance;
}
}
//饿汉式
public class SingleB {
/*由于INSTANCE的初始化是在类加载时进行的,而类的加载是由ClassLoader来做的,所以开发者本来对
于它初始化的时机就很难去准确把握:
1.可能由于初始化的太早,造成资源的浪费
2.如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好。
*/
//创建对象
private static final SingleB INSTANCE = new SingleB();
//私有的构造方法
private SingleB() {}
//供外部调用的方法静态方法
public static SingleB getInstance() {
return INSTANCE;
}
}
懒汉式:在静态方法中初始化。时间换空间。(不推荐,时间很重要)
饿汉式:在声明对象就初始化。空间换时间。(推荐,空间不是问题)
工厂模式
简单工厂设计模式的一般定义:简单工厂又叫静态工厂,由一个工厂对象决定创建哪一个产品对象
实现思路:写一个类,让他制造出我们想要的对象
代码:
public class 学生工厂 {
//get方法通常是静态的,所以也称之为静态工厂
public static 学生 getStudent(int type) {
//利用switch创建学生并返回
switch (type) {
case 学生类型.学神:
return new 学神();
case 学生类型.学霸:
return new 学霸();
case 学生类型.学弱:
return new 学弱();
case 学生类型.学渣:
return new 学渣();
default:
break;
}
return null;
}
}