设计模式之单例模式(Singleton)
2013-03-02 21:21
204 查看
见词知意,所谓的单例也就是指只能有一个实例,单例模式最常见的有饿汉式和懒汉式两种。
饿汉式单例类在类初始化时已经自行的初始化了:
而懒汉式单例在第一次调用的时候初始化:
对于懒汉式的得到实例的方法加的synchronized,是因为如果多个线程在同一时间执行相同的代码,会出现多个实例,不满足单例模式的要求,他是线程不安全的,所以要加上sychronized。
在上述示例中,我们把实例的权限设置为了私有的类,这样就防止了使用者直接new一个实例,而即使是private权限也可以通过反射机制的setAccesible来得到这个类的实例,为了防止使用者这样来创建,我们需要在 ReflectPermission("suppressAccessChecks")权限下使用安全管理器(SecurityManager)的checkPermission方法来限制这种突破。一般来说,不会真的去做这些事情,都是通过应用服务器进行后台配置实现。
最后 单例模式很难实现序列化,而且不能被别的类继承。
饿汉式单例类在类初始化时已经自行的初始化了:
public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
而懒汉式单例在第一次调用的时候初始化:
public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single=null; //静态工厂方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
对于懒汉式的得到实例的方法加的synchronized,是因为如果多个线程在同一时间执行相同的代码,会出现多个实例,不满足单例模式的要求,他是线程不安全的,所以要加上sychronized。
在上述示例中,我们把实例的权限设置为了私有的类,这样就防止了使用者直接new一个实例,而即使是private权限也可以通过反射机制的setAccesible来得到这个类的实例,为了防止使用者这样来创建,我们需要在 ReflectPermission("suppressAccessChecks")权限下使用安全管理器(SecurityManager)的checkPermission方法来限制这种突破。一般来说,不会真的去做这些事情,都是通过应用服务器进行后台配置实现。
最后 单例模式很难实现序列化,而且不能被别的类继承。
相关文章推荐
- 设计模式之单例模式(Singleton)
- 转帖:C#中不需要用锁的线程安全的Singleton设计模式!
- **Java设计模式__单例模式(Singleton)**
- ava设计模式之Singleton模式
- ios单态(singleton)设计模式
- OGRE分析之设计模式Singleton,Factory Method,Abstract Factory
- 设计模式--单例模式Singleton(创建型)
- 设计模式之单例模式(Singleton)
- JAVA设计模式之三单例模式(Singleton)
- 设计模式--单例模式Singleton
- JAVA设计模式之三单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- java设计模式之单件模式Singleton
- 设计模式 之 --- 单例(Singleton)模式
- Java设计模式连载_1_单例模式(Singleton)
- 设计模式 -- Singleton
- 设计模式之单例模式Singleton
- 设计模式学习笔记之Singleton模式
- 在 Java 中应用设计模式 -- Singleton
- 设计模式--单例(singleton)实例