昨天晚上和毛驴讨论到很晚,关于单态模式和工厂模式。
首先来回忆一下,什么是单态模式和工厂模式。单态模式说得明了一点就是:一个类产生的所有对象都是同一个。为什么要将一个类的对象都限制成一个呢?这是为了在调用这个类的方法的时候,避免在Web开发过程中产生过多的对象,频繁的调用构造方法,然后再调用对象的销毁方法,这样浪费了容器的很多资源。工厂模式,顾名思义就是将许多类放到一个类Factory中进行“集中实例化”,就像是一个工厂一样,以后要是具体的某一个类A要用到其中的一个类B的实例,就可以直接实例化 Factory的一个对象,然后通过这个对象来调用类Factory中获取B类实例的方法获得B的实例,而不需要在自己的类中去new类B的对象。要是A类只用到了少量几个类,这样的做法似乎不是很奏效,但是如果A用到了大部分的类,而且个数是比较多的,这样的情况下,就只需要在A类中new一个Factory的实例,然后就可以很容易获取到它所需要的各个类的实例了。因为Factory中已经包含了所有类的实例获取方法,这也许就是“工厂”的由来吧。
如何实现“单态”?我们知道,当一个类的构造器的可见度设置成“private”的时候,就不能在类外调用它的构造方法了。就是说只能在类的内部调用它的方法,而在类内部调用构造方法,调用几次构造方法是我们可以控制的。在类的内部设置一个可以获得类实例的方法来获得类的实例,为了使类的对象是唯一的,也就是说是满足单态模式的目的的,就应该将返回的类对象设置成一个static类型的,接下来在类的实现过程中,要判断是否已经存在了一个类的对象,要是存在就直接返回对象不调用构造方法,要是不存在就调用构造方法,生成一实例。这样,在类外调用它的时候,不论调用多少次,都是返回同一个实例。
Spring对工厂模式的实现,是通过配置文件和IoC容器来完成的。配置文件给每个bean创建了一个ID,这是唯一的,就是通过这个ID来告诉IoC要调用哪个bean的构造方法,而调用构造方法也不是我们要操心的问题,我们只要使用IoC给我们创建的实例就足够了。这样看来,IoC容器是一个实现了Factory设计模式的巨大Bean工厂。