实现单例模式主要有以下几个关键点。
(1)构造函数不对外开放,一般为private;
(2)通过一个构造方法或者枚举返回单例类的对象;
(3)确保单例类的对象有且只有一个,尤其是在多线程的情况下;
(4)确保单例对象在反序列化时不会重新构造对象;
单例模式的简单实例(饿汉模式)
一个公司员工组成为例 一个公司只能有一个CEO 许多个VP和员工
//员工类
public class Staff {
public void work() {
// 干活
}
}
//VP类
package demo;
//副总裁
public class VP extends Staff {
public void work() {
// 管理下面经理
}
}
//CEO
package demo;
//饿汉模式单例
public class CEO extends Staff {
private CEO() {
}
public static final CEO mCeo = new CEO();
public static CEO getCeo() {
return mCeo;
}
public void work() {
// 管理VP
}
}
//公司类
package demo;
import java.util.ArrayList;
import java.util.List;
public class Company {
private List<Staff> allStaffs = new ArrayList<Staff>();
public void addStaff(Staff staff) {
allStaffs.add(staff);
}
public void showAllStaffs() {
for (Staff s : allStaffs) {
System.out.println("员工 :" + s.toString());
}
}
}
//测试类
package demo;
public class Test {
public static void main(String[] args) {
//招聘CEO
company.addStaff(CEO.getCeo());
company.addStaff(CEO.getCeo());
//招聘VP
company.addStaff(new VP());
company.addStaff(new VP());
//招聘Staff
company.addStaff(new Staff());
company.addStaff(new Staff());
company.addStaff(new Staff());
company.showAllStaffs();
}
}
最后的输出结果
员工 :demo.CEO@15db9742
员工 :demo.CEO@15db9742
员工 :demo.VP@6d06d69c
员工 :demo.VP@7852e922
员工 :demo.Staff@4e25154f
员工 :demo.Staff@70dea4e
员工 :demo.Staff@5c647e05
总结 由此可以看到 CEO是同一个对象 只能通过GET方式获取 很明显的看出单例类和非单例类的区别。