单例模式(java 实现 Singleton)(一)

来源:互联网 发布:自学网下载软件 编辑:程序博客网 时间:2024/06/05 16:03

网上有很多单例模式的代码,之前也只是草草的知道单例模式怎么写,大概的用途。

今天看书《Java开发实战经典》的时候又看到了单例模式,根据自己的理解说明一下单例模式的实现步骤(过程):

1.  ——>对构造方法的封装( private 类名() )

class Singleton{    private Singleton() {//对构造方法的封装    }    public void sayHello(){//普通方法        System.out.println("Hello, Singleton");    }}


通过私有化构造方法,外部不可调用构造方法生成本类对象。(所以下一步要解决如何生成本类对象?)

2.  ——>在类内部生成本类对象

class Singleton{    Singleton instance = new Singleton();//在内部生成本类对象    private Singleton() {    }    public void sayHello(){        System.out.println("Hello, Singleton");    }}

虽然生成了本类对象,但如何把对象传递给外部使用呢?而外部又不能生成本类的实例获得,所以只能通过把想调用的成员变成类成员,然后通过类名称来直接调用。所以下一步就是将内部生成的对象变成类成员。

3.  ——>添加static关键字使内部对象变成类成员

class Singleton    static Singleton instance = new Singleton();//将内部对象变成类成员    private Singleton() {    }    public void sayHello(){        System.out.println("Hello, Singleton");    }}

但是类中的属性必须封装,所以下一步要封装此内部对象。

4.  ——>对类成员对象进行封装(private),不允许直接访问类属性

class Singleton    private static Singleton instance = new Singleton();        //对类成员对象进行封装    private Singleton() {    }    public void sayHello(){        System.out.println("Hello, Singleton");    }}


到了这里,就很容易想到下一步应该是生成返回封装属性的方法了,不过因为此处的属性(内部生成的对象)是静态属性(类属性),所以获得这个属性的方法也要是静态方法(可以使用类名直接调用的类方法)。

5.  ——>生成返回封装后的静态成员对象的静态方法

class Singleton    private static Singleton instance = new Singleton();    private Singleton() {    }    public static Singleton getInstance(){//用来获得静态属性的静态方法        return instance;    }    public void sayHello(){        System.out.println("Hello, Singleton");    }}
到此一个完整的单例模式就完成了,可以被类名直接调用获得此类对象(e.g.  Singleton s1 = Singleton.getInstance() )

即:无论程序怎样运行,Singleton类永远只会有一个实例化对象存在。


PS: 只要将构造方法私有化,就可以控制实例化对象的产生。(核心)






0 0