单例模式
来源:互联网 发布:python ascii转字符 编辑:程序博客网 时间:2024/06/05 15:47
单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
单例的3个要素:
1)一个类只能有一个实例
2)必须自行创建
3)必须自行向这个系统提供这个实例
注意:构造子是私有的,不能被继承(登记式单例除外)
3种单例:
1)饿汉式单例
2)懒汉式单例
3)登记式单例
单例状态
有状态:通常的形式是:有属性,无方法,例如:计数器,状态库(reopsitory)
无状态:通常的形式是:有方法,无属性,例如:工具性函数对象
例子:
资源管理器
打印机
通信端口管理
系统属性文件(properties)
回收站
1)懒汉、饿汉式单例
Eager_Lazy.java
2)登记式单例
RegSingleton.java
RegSingletonChild.java
TestSingleton.java
单例的3个要素:
1)一个类只能有一个实例
2)必须自行创建
3)必须自行向这个系统提供这个实例
注意:构造子是私有的,不能被继承(登记式单例除外)
3种单例:
1)饿汉式单例
2)懒汉式单例
3)登记式单例
单例状态
有状态:通常的形式是:有属性,无方法,例如:计数器,状态库(reopsitory)
无状态:通常的形式是:有方法,无属性,例如:工具性函数对象
例子:
资源管理器
打印机
通信端口管理
系统属性文件(properties)
回收站
1)懒汉、饿汉式单例
Eager_Lazy.java
- /**
- * static 修饰的变量和代码区,只有在该类的静态方法或属性在第一次被访问的时候,才会初始化
- * static final 修饰的变量,是在编译期间就会被初始化
- * static final修饰的的对象或者变量,在加载类之前就存在
- */
- // 饿汉式单例类.在类初始化时,已经自行实例化
- class EagerSingleTon {
- private static final EagerSingleTon instance = new EagerSingleTon();
- private EagerSingleTon() {
- }
- public static EagerSingleTon getInstance() {
- return instance;
- }
- }
- // 懒汉式单例类,在第一次调用的时候被实例化
- class LazySingleTon {
- // 注意,这里没有final
- private static LazySingleTon instance = null;
- private LazySingleTon() {
- }
- public synchronized static LazySingleTon getInstance() {
- if (instance == null) {
- instance = new LazySingleTon();
- }
- return instance;
- }
- }
2)登记式单例
RegSingleton.java
- package CreationalPattern.Singleton;
- import java.util.HashMap;
- /*
- 目的:克服懒汉式和饿汉式单例不能集成的缺点而设计.
- 缺点1:父类构造子公开,可以不登记
- 缺点2:父类必须存在,才能有子类
- */
- public class RegSingleton {
- static private HashMap m_registry = new HashMap();
- static {
- RegSingleton x = new RegSingleton();
- m_registry.put(x.getClass().getName(), x);
- }
- protected RegSingleton() {
- }
- static public RegSingleton getInstance(String name) {
- if (name == null) {
- name = "CreationalPattern.Singleton.RegSingleton";
- }
- if (m_registry.get(name) == null) {
- try {
- m_registry.put(name, Class.forName(name).newInstance());
- } catch (Exception e) {
- }
- }
- return (RegSingleton) (m_registry.get(name));
- }
- /**
- * 示例方法
- */
- public String about(){
- return "this is RegSingleton.";
- }
- }
RegSingletonChild.java
- package CreationalPattern.Singleton;
- public class RegSingletonChild extends RegSingleton {
- //必须公开
- public RegSingletonChild() {
- }
- static public RegSingletonChild getInstance(){
- //在父类里new的子类,所以子类的构造子必须是公开的
- return (RegSingletonChild)(RegSingleton.getInstance("CreationalPattern.Singleton.RegSingletonChild"));
- }
- public String about(){
- return "this is RegSingletonChild.";
- }
- }
TestSingleton.java
- package CreationalPattern.Singleton;
- public class TestSingleton {
- public static void main(String[] args) {
- TestSingleton t = new TestSingleton();
- System.out.println(t.getClass().getName());
- System.err.println("error!");
- //4种调用登记式单例的方式
- System.out.println(RegSingleton.getInstance("CreationalPattern.Singleton.RegSingleton").about());
- System.out.println(RegSingleton.getInstance(null).about());
- System.out.println(RegSingletonChild.getInstance().about());
- System.out.println(RegSingletonChild.getInstance("CreationalPattern.Singleton.RegSingletonChild").about());
- }
- }
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- PostMessage与PostThreadMessage的区别
- win7下显示系统的后缀名
- ios--UIActionSheet的使用
- register_chrdev()与unregister_chrdev()
- 页面中文字不被选中
- 单例模式
- 线程间如何进行消息传递
- Qt 中使用全局变量
- 使用oracle 的 PL/Sql 定时执行一个存储过程
- 【JMLR’03】Latent Dirichlet Allocation (LDA)- David M.Blei
- 简化delegate写法
- CentOS 6.3设置静态IP教程
- asynch descriptor resize等待事件
- leetcode 第27-28 题 Implement strStr() & Divide Two Integers