工厂模式是我们最常用的设计模式,学好这个模式当然可以事半功倍,不用关心如何创建,只需要根据相应的需求去 获取相应的对象。 假如我们现在需要得到一个Ipod对象和Mac对象,可能在之前,我们的Ipod和Mac都是new出来了,相当于我们的程序依赖了Ipod类和Mac, 但是使用了工厂我们就可以部分解耦,将创建和使用分离。 设计模式有一条原则,对象要么构造其他对象,要么使用其他对象,绝对不要两者兼顾。如果遵守这一约束,最终可以降低耦合度。
1、简单工厂
public class AppleSimpleFactory {
private static Map beanMap = new HashMap();
public Object getBean(String beanName) {
if(beanMap.containsKey(beanName)) {
returnbeanMap.get(beanName);
}
return null;
}
public void init() {
beanMap.put("Ipod", newIpod());
beanMap.put("Mac", newMac());
}
}
2、抽象工厂abstract factory
抽象工厂类似于将工厂再抽象一层,让关注点不在于怎么创建,而在于创建不同的方式。 例如,A工厂生产ipod的时候需要打印A的牌子,而B工厂生产的时候需要打B的牌子,生产的产品都是一样的,都是ipod,但是其中的工序和方式不同
public abstract class MyAbstractFactory {
protected static MapbeanMap =new HashMap();
public abstract void create();
public abstract Product getProduct(String className);
}
public class MyAbstractFactoryImpl extends MyAbstractFactory {
@Override public void create() {
Ipod iPod =newIpod();
iPod.pasteSign("made by A factory");
beanMap.put("Ipod", newIpod());
beanMap.put("Mac", newMac());
}
@Override public Product getProduct(String className) {
if(beanMap.containsKey(className)) {
return (Product)beanMap.get(className);
}
returnnull;
}
}
工厂方法类似,其中最主要的就是贴牌的不同。 抽象工厂用于创建相同的产品但是方式不同的地方。
spring 的beanFactory
在 Spring 中,两个最基本最重要的包是 org.springframework.beans 和 org.springframework.context 。这两个包中的代码为 Spring 的控制反转特性(也叫作依赖注入)提供了基础。 BeanFactory 提供了一种先进的配置机制来管理任何种类 bean (对象),这种配置机制考虑到任何一种可能的存储方式。 ApplicationContext 建立在 BeanFactory 之上,并增加了其他的功能,比如更容易同 Spring AOP 特性整合, 消息资源处理(用于国际化),事件传递,以声明的方式创建 ApplicationContext, 可选的父上下文和与应用层相关的上下文(比如WebApplicationContext),以及其他方面的增强。 简而言之,BeanFactory 提供了配置框架和基本的功能, 而 ApplicationContext 为它增加了更强的功能,这些功能中的一些或许更加接近 J2EE 并且围绕企业级应用。
一 般来说, ApplicationContext 是 BeanFactory 的完全超集, 任何 BeanFactory 功能和行为的描述也同样被认为适用于 ApplicationContext 用户有时不能确定 BeanFactory 和 ApplicationContext 中哪一个在特定场合下更适合。 通常大部分在 J2EE 环境的应用中,最好选择使用 ApplicationContext , 因为它不仅提供了 BeanFactory 所有的特性以及它自己附加的特性,而且还提供以声明的方式使用一些功能, 这通常是令人满意的。 BeanFactory 主要是在非常关注内存使用的情况下 (比如在一个每 kb 都要计算的 applet 中)使用,而且你也不需要用到 ApplicationContext 的所有特性。