Java研发工程师知识点总结
五分钟一个设计模式
工厂模式
1.单例模式
(1)单例模式是一个非常简单的设计模式,它的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点
有些数据库操作类或者工具类会使用单例模式。
例如:对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;售票时,一共有100张票,可有有多个窗口同时售票,但需要保证不要超售(这里的票数余量就是单例,售票涉及到多线程)。如果不是用机制对窗口对象进行唯一化将弹出多个窗口,如果这些窗口显示的都是相同的内容,重复创建就会浪费资源。
(2)lazy initialization就是在使用的时候才进行初始化,与之对应的是在类加载的时候就初始化(即时加载)。二者的区别在于对象的生成时间不同;
public final class Singleton {
// private static Singleton st;//lazy initialization 类调用时才生成对象;
private static Singleton st = new Singleton();//即时加载 类加载时就生成对象;
private Singleton() {// 构造私有
}
public static Singleton getInstance() {// 提供方法
/*
* if(st==null){ st =new Singleton(); }
*/
return st;
}
}
public class Singleton {
//将构造函数声明为private,防止外界直接通过构造函数来创建对象,只能在类内部创建对象
private Singleton()
{ }
private static Singleton uniqueInstance;
public static Singleton GetInstance(){
synchronized (Singleton.class){
//当需要创建对象时,调用私有的构造函数来创建
//下次调用时,对象不为null,就直接返回对象实例了,
//所以,uniqueInstance值会被实例化一次,
//Singleton类也只有这么一个对象
if (uniqueInstance == null)
uniqueInstance = new Singleton();
return uniqueInstance;
}
}
public void DoSomething()
{
System.out.println("do something with unique instance");
}
}
(3)一般来说,单例模式有五种写法:懒加载、急加载、双重检查加锁锁、静态内部类、枚举。一般情况下直接使用急加载,如果明确要求要懒加载(lazy initialization)会使用静态内部类;
//急加载 static final field 线程安全
public class Singleton{
//类加载时就初始化
private static final Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
//静态内部类 static nested class 线程安全
public class Singleton {
private static class SingletonHolder {
private static final Singleton uniqueInstance = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.uniqueInstance;
}
}
//枚举 Enum 线程安全
public enum EasySingleton{
INSTANCE;
}
2.public/private/protected
(1)public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
(2)private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
(3)protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。