单例模式/工厂模式

来源:互联网 发布:四川麻将规则算法 编辑:程序博客网 时间:2024/04/29 23:23
                单例模式

定义:是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
要点:
1、某个类只能有一个实例
2、它必须自行创建这个实例
3、它必须自行向整个系统提供这个实例
具体描述:
1、 单例模式的类只提供私有的构造函数
2、 类定义中含有一个该类的静态私有对象
3、 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
优缺点:
优点:1、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:1、开销
虽然数量很少,但是如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销,可以通过静态初始化解决此问题。
2、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员记住必须记住自己不能使用new关键字实例化对象,因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
3、对象生存期
不能解决删除单个对象的问题,在提供内存管理的语言中(例如基于.net framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用,在某些语言中(如C++语言),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
模式:
一般Singleton模式通常有三种形式:
示例1(俗称懒汉式):

public class SingletonClass {    private SingletonClass(){}    private static SingletonClass instance=null;    public static synchronized SingletonClass getInstance(){        if(instance==null)        {            instance=new SingletonClass();        }        return instance;    }}

示例1由于用到了java关键字synchronized(后面将做介绍) ,所以是线程安全的,当去除了关键字synchronized ,则懒汉式是线程不安全的
示例2(俗称饿汉式):

public class Singleton {    private static Singleton instance=new Singleton();    private Singleton(){}    public static Singleton getInstance()    {            return instance;    }}

饿汉式亦有个变形如下:

public class Singleton {    private static Singleton instance=null;    static{    instance=new Singleton();    }    private Singleton(){}    public static Singleton getInstance()    {        return this.instance;    }}

这两种写法从本质上分析起来性质是相同的,都是在类初始化即实例化instance
示例3(俗称双重锁形式):

public class SingletonDouble {    private static SingletonDouble instance=null;    private SingletonDouble(){}    public static SingletonDouble getInstance()    {        if(instance==null){            synchronized (SingletonDouble.class) {                if(instance==null)                    instance=new SingletonDouble();            }        }        return instance;    }}

下面介绍一下synchronized
synchronized —Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this) 同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用。
简单说就是通过synchronized关键字能增加线程安全机制。

                 **工厂模式**工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Sample a=new Sample() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。简单来说,工厂模式就是有一个类(类似于构造函数产地)用于生成类对象,模式如下:
public class Factory {    public static Isample creator(int which)    {        if(which==1)            return new SampleA();        else if(which==2)            return new SampleB();    }}

显然例子中 Isample 是一个接口,SampleA和SampleB都是Isample 的实现类

0 0