简单工厂
所谓的工厂,就是用来制造的东西的,在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来提供参数输入
- 来源于配置文件,从配置文件获取用于判断的值
- 来源于程序运行时的某个值,比如缓存中获取某个运行时的值