工厂方法以及spring对工厂方法的支持

来源:互联网 发布:java教育平台源码下载 编辑:程序博客网 时间:2024/06/05 18:32

虽然对象可以通过接口来避免对特定实现类的过度耦合,但是我们仍然需要将接口与实现类关联起来

我们通常像下面这样直接声明对象,但是这样接口与实现类之间的耦合性过强。

public class Foo {    private BarInterface barInstance;    public Foo() {        barInstance=new BarInterfaceImpl();    }}

为了避免接口与实现类的强耦合,通常的做法是使用工厂类来实例化接口的实现类,这样主体对象只要依赖工厂类。即使具体的实现类发生了变化只要改动工厂类.避免了具体实现类的变更

静态工厂方法

利用Spring完成工厂方法代码如下

接口

public interface BarInterface {    void say();}

接口实现类

public class BarInterfaceImpl implements BarInterface {    public void say() {        System.out.println("bar");    }}
public class Foo {    private BarInterface barInstance;    public Foo() {    }    public void say() {        barInstance.say();    }    public void setBarInstance(BarInterface barInstance) {        this.barInstance = barInstance;    }    public BarInterface getBarInstance() {        return barInstance;    }}

工厂类

public class StaticBarInterfaceFactory {    public static BarInterface getInstance() {        return new BarInterfaceImpl();    }}

在spring.xml中配置如下

<bean id="bar" class="com.spring.bean.factory.StaticBarInterfaceFactory" factory-method="getInstance"/><bean id="foo" class="com.spring.bean.factory.Foo">    <property name="barInstance" ref="bar"/></bean>

如果工厂类对应的getInstance方法需要参数用于构造对象的话,可以更改如下

<bean id="bar" class="com.spring.bean.factory.StaticBarInterfaceFactory" factory-method="getInstance">            <constructor-arg index="0" value="str"/></bean>

非静态工厂方法

public class NonStaticBarInterfaceFactory {    public BarInterface getInstance() {        return new BarInterfaceImpl();    }}
<bean id="barFactory" class="com.spring.bean.factory.NonStaticBarInterfaceFactory"/><bean id="bar2" factory-bean="barFactory" factory-method="getInstance"></bean><bean id="foo2" class="com.spring.bean.factory.Foo">        <property name="barInstance" ref="bar2"/></bean>
原创粉丝点击