初接触设计模式--简单工厂(二)

258 阅读2分钟

简单工厂

所谓的工厂,就是用来制造的东西的,在java里,这就意味着创建接口,抽象类,或者类的实例。

先看一下不用任何模式的时候我们是怎么使用一个类的实例的。

接口

public interface Api {

    void speak();
}

对接口的一个实现

public class AImpl implements Api {
    @Override
    public void speak() {
        System.out.println("这是Aimpl");
    }
}

对接口的另一个实现

public class BImpl implements Api {
    @Override
    public void speak() {
        System.out.println("这是Bimpl");
    }
}

使用


public class DemoMain {

    public static void main(String args[]){

        Api api=new AImpl();
        api.speak();

    }
}

问题:假设有这样的一个场景,在代码中,Aimpl的创建有数十上百个,当我们需要更改创建为Bimpl时,工作量就非常大了。 同样,如果需要根据选择创建不同的实例,难免需要写一堆的if-else。

这个时候简单工厂就是一个不错的解决方案。

工厂类

public class Factory {

    private Factory() {}
    //返回AImpl实例
    public static Api createAImpl()
    {
        return new AImpl();
    }
    //返回BImpl实例
    public static Api createBImpl()
    {
        return new BImpl();
    }
    根据选择返回相应的实例
    public static Api createImpl(int select)
    {
        if (select==0)
            return new AImpl();
        else if (select==1)
            return new BImpl();
        else
            return null;
    }
}
public class DemoMain {

    public static void main(String args[]){

        Api api=Factory.createImpl(1);
        //Api api=Factory.createAImpl();
        //Api api=Factory.createBImpl();
        api.speak();

    }
}

通过这样的一个方式,就能把实例的创建细节放到了工厂类里面,实现了将创建和使用隔离了开来。想获取什么样的实例,就通过工厂类来获取, 对以后的修改和扩展就带来了不少的便利。

看了上面的代码,其实不难发现,相比于实例的创建,不如说简单工厂,其实就是在内部 选择合适的类 ,然后返回给客户。

既然是选择,那就应该有外部的信息传入,指示工厂应该选择什么样的类,通常这些信息的来源有以下几种。

  • 来源于客户端 ,由client来提供参数输入
  • 来源于配置文件,从配置文件获取用于判断的值
  • 来源于程序运行时的某个值,比如缓存中获取某个运行时的值