王大虎

王大虎:我是皇帝我独苗

王大虎

自从秦始皇确立了皇帝这个位置以后,同一时期基本上就只有一个人孤零零地坐在这个位置。这种情况下臣民们也好处理,大家叩拜、谈论的时候只要提及皇帝,每个人都知道指的是谁,而不用在皇帝前面加上特定的称呼,如张皇帝、李皇帝。这一个过程反应到设计领域就是,要求一个类只能生成一个对象(皇帝),所有对象对它的依赖都是相同的,因为只有一个对象,大家对它的脾气和习性都非常了解,建立健壮稳固的关系,我们把皇帝这种特殊职业通过程序来实现。

皇帝每天要上朝接待臣子、处理政务,臣子每天要叩拜皇帝,皇帝只能有一个,也就是一个类只能产生一个对象,该怎么实现呢?对象产生是通过new关键字完成的(当然也有其他方式,比如对象拷贝、反射等),这个怎么控制呀,但是大家别忘记了构造函数,使用new关键字创建对象时,都会根据输入的参数调用相应的构造函数,如果我们把构造函数设置为private私有访问权限不就可以禁止外部创建对象了吗?臣子叩拜唯一皇帝的过程如类图7-1所示。

 

图7-1 臣子叩拜皇帝类图

只有两个类,Emperor代表皇帝类,Minister代表臣子类,关联到皇帝类非常简单。Emperor如代码清单7-1所示。

代码清单7-1 皇帝类

王大虎
王大虎

 

public class Emperor { private static final Emperor emperor =new Emperor(); //初始化一个皇帝 private Emperor(){ //世俗和道德约束你,目的就是不希望产生第二个皇帝 } public static Emperor getInstance(){ return emperor; } //皇帝发话了 public static void say(){ System.out.println(“我就是皇帝某某某….”); } }

王大虎

* * *

 

通过定义一个私有访问权限的构造函数,避免被其他类new出来一个对象,而Emperor自己则可以new一个对象出来,其他类对该类的访问都可以通过getInstance获得同一个对象。

皇帝有了,臣子要出场,其类如代码清单7-2所示。

代码清单7-2 臣子类

 

* * *

 

public class Minister { public static void main(String[] args) { for(int day=0;day<3;day++){ Emperor emperor=Emperor.getInstance(); emperor.say(); } //三天见的皇帝都是同一个人,荣幸吧! } }

 

* * *

 

臣子参拜皇帝的运行结果如下所示。

 

* * *

王大虎

我就是皇帝某某某…. 我就是皇帝某某某…. 我就是皇帝某某某….

 

* * *

 

臣子天天要上朝参见皇帝,今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,老熟人了,容易讲话,这就是单例模式。

 

 

7.2 单例模式的定义

 

单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:

Ensure a class has only one instance,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

单例模式的通用类图如图7-2所示。

 

图7-2 单例模式通用类图

Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。单例模式的通用源代码如代码清单7-3所示。

代码清单7-3 单例模式通用代码

 

* * *

 

public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } }

 

* * *

 

王大虎

7.3 单例模式的应用

 

7.3.1 单例模式的优点

 

·由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

·由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVMX回收机制)。

·单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。

·单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注